Stack Overflow est un site pour les questions de programmation et de développement. Cette question semble hors sujet car elle ne concerne ni la programmation ni le développement. Consultez la rubrique Quels sujets puis-je poser ici dans le centre d'aide. Peut-être que Super User ou Unix & Linux Stack Exchange serait un meilleur endroit pour demander.
jww
20
@jww Je ne suis pas d'accord, openssl est une boîte à outils de bas niveau et les développeurs doivent s'en occuper tout le temps. La ligne est assez floue, et ce serait une grande perte de ne pas autoriser les questions openssl ici simplement parce qu'il se trouve qu'il s'agit d'une CLI plutôt que de la bibliothèque C.
gtd
@gtd - c'est une plainte fréquente lorsque je les signale. Voir également Où puis-je publier des questions sur Dev Ops? . (Mais je pense que j'ai fait une erreur sur celui-ci - la question est de 2011, et je crois que c'était sur le sujet à l'époque. Je n'aime pas pénaliser pour le changement de politique).
jww
2
@gtd - re: "openssl est une boîte à outils de bas niveau et les développeurs doivent s'en occuper tout le temps." - c'est à cela que servent Super User ou Unix & Linux Stack Exchange . "... ce serait une grosse perte de ne pas autoriser les questions openssl ..." - Les questions de programmation openssl C sont toujours les bienvenues ici. La perte des questions non liées à la programmation ne sera pas manquée car Stack Overflow est un site de programmation et de développement. Il existe d'autres sites sur lesquels vous pouvez vous rendre lorsque vous ne savez pas comment utiliser une commande.
jww
Merci pour le lien, je posterai ma réponse là-bas car je pense que c'est une question très importante.
gtd
Réponses:
123
L'option -nodesn'est pas le mot anglais "nodes", mais plutôt "no DES". Lorsqu'il est donné en argument, cela signifie qu'OpenSSL ne chiffrera pas la clé privée dans un fichier PKCS # 12 .
Pour crypter la clé privée, vous pouvez l'omettre -nodeset votre clé sera cryptée avec 3DES-CBC. Pour crypter la clé, OpenSSL vous demande un mot de passe et utilise ce mot de passe pour générer une clé de cryptage à l'aide de la fonction de dérivation de clé EVP_BytesToKey .
En fonction de votre version d'OpenSSL et des options compilées, vous pourrez peut- être fournir ces options à la place de -nodes:
-des encrypt private keys with DES
-des3 encrypt private keys with triple DES (default)
-idea encrypt private keys with idea
-seed encrypt private keys with seed
-aes128, -aes192, -aes256
encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
encrypt PEM output with cbc camellia
Finalement, au niveau de la bibliothèque, OpenSSL appelle la fonction PEM_write_bio_PrivateKey avec l'algorithme de chiffrement (ou son absence) que vous choisissez.
Par chiffrer, voulez-vous dire avec un mot de passe?
Flimm
4
@Flimm: Protégé par un mot de passe, oui. Le mot de passe génère une clé de cryptage à l'aide d'un algorithme de dérivation de clé, et le cryptage est effectué avec la clé, pas avec le mot de passe. La seule façon d'utiliser la clé chiffrée est de la déchiffrer d'abord, pour lequel vous devez connaître le mot de passe avec lequel elle a été chiffrée pour générer la même clé.
indiv
pourquoi shoulud je crypte mon fichier de clé privée? ceux-ci ne sont publiés à personne, d'où le nom. Ou ai-je tort?
phil294
1
@Blauhirn: Vous crypteriez votre fichier de clé privée pour la même raison que vous crypteriez n'importe quel fichier: vous ne voulez pas que quelqu'un qui obtient une copie puisse le lire ou l'utiliser. Le chiffrement de la clé privée dépend de l'importance de la clé et de votre modèle de menace.
indiv
12
edit: nginx v1.7.3 a ajouté une directive ssl_password_file qui lit les phrases de passe à partir d'un fichier spécifié en essayant chaque phrase de passe sur le encrypted-private.key du contexte
indiv est exact que les -nodesmoyens d'argument que OpenSSL va créer UNENCRYPTED private.key ; sinon, il y aura une invite de phrase de passe pour créer encrypted-private.key . voir req , pkcs12 , CA.pl
cependant, je pense que le but (pour les programmeurs) est que:
Les serveurs HTTP (par exemple Apache , Nginx ) ne peuvent pas lire encrypted-private.key sans mot de passe →
Option A - chaque fois que le serveur HTTP démarre, doit fournir une phrase de passe pour encrypted-private.key
Option B - spécifier ssl_password_file file.keys;dans http { }ou server { }contexte. [ ref ]
Option C - utiliser -nodespour créer private.key sans cryptage
utile: verrouiller private.key
{ajouter un serveur HTTP au groupe ssl-cert }
sudo chown root:ssl-cert private.key- ch ange propre er de private.key à racine utilisateur, ssl-cert groupe
sudo chmod 640 private.key- changer les autorisations d'accès de private.key en propriétaire R / W, groupe R
maintenant, le serveur HTTP devrait pouvoir démarrer et lire une clé privée non chiffrée .
Option A
sécurité renforcée, mais lorsque le serveur redémarre, vous devez saisir manuellement la phrase de passe pour encrypted-private.key
Option B
sécurité moyenne, et probablement un bon équilibre entre A / C
Option C
plus faible sécurité, mais pas invité à entrer UNENCRYPTED private.key passphrase
Nginx peut lire les clés privées chiffrées depuis la version 1.7.3, voir: nginx.org/en/docs/http
...
2
Quel est le but d'intégrer nginx et ses versions dans la discussion? De plus, (B) et (C) offrent une sécurité équivalente (à savoir, les ACL du système de fichiers). Le problème que vous décrivez est le problème de stockage de clés sans assistance , et c'est un problème sans solution. Voir le livre Engineering Security de Gutmann .
jww
@jww la question demande "quel est le but ...". J'ai considéré le contexte de la question (QnA pour les programmeurs), que j'ai tenté d'indiquer via "cependant, je pense que le but (pour les programmeurs) est que:". spécifiquement concernant la sécurité .. peut être une discussion pour security.stackexchange.com
Réponses:
L'option
-nodes
n'est pas le mot anglais "nodes", mais plutôt "no DES". Lorsqu'il est donné en argument, cela signifie qu'OpenSSL ne chiffrera pas la clé privée dans un fichier PKCS # 12 .Pour crypter la clé privée, vous pouvez l'omettre
-nodes
et votre clé sera cryptée avec 3DES-CBC. Pour crypter la clé, OpenSSL vous demande un mot de passe et utilise ce mot de passe pour générer une clé de cryptage à l'aide de la fonction de dérivation de clé EVP_BytesToKey .En fonction de votre version d'OpenSSL et des options compilées, vous pourrez peut- être fournir ces options à la place de
-nodes
:Finalement, au niveau de la bibliothèque, OpenSSL appelle la fonction PEM_write_bio_PrivateKey avec l'algorithme de chiffrement (ou son absence) que vous choisissez.
la source
edit: nginx v1.7.3 a ajouté une directive ssl_password_file qui lit les phrases de passe à partir d'un fichier spécifié en essayant chaque phrase de passe sur le encrypted-private.key du contexte
indiv est exact que les
-nodes
moyens d'argument que OpenSSL va créer UNENCRYPTED private.key ; sinon, il y aura une invite de phrase de passe pour créer encrypted-private.key . voir req , pkcs12 , CA.plcependant, je pense que le but (pour les programmeurs) est que:
ssl_password_file file.keys;
danshttp { }
ouserver { }
contexte. [ ref ]-nodes
pour créer private.key sans cryptageutile: verrouiller private.key
sudo chown root:ssl-cert private.key
- ch ange propre er de private.key à racine utilisateur, ssl-cert groupesudo chmod 640 private.key
- changer les autorisations d'accès de private.key en propriétaire R / W, groupe ROption A
sécurité renforcée, mais lorsque le serveur redémarre, vous devez saisir manuellement la phrase de passe pour encrypted-private.key
Option B
sécurité moyenne, et probablement un bon équilibre entre A / C
Option C
plus faible sécurité, mais pas invité à entrer UNENCRYPTED private.key passphrase
la source