Évitez les invites de mot de passe pour les clés et les informations de DN

90

J'utilise le code suivant pour générer des clés:

apt-get -qq -y install openssl;
mkdir -p /etc/apache2/ssl;
openssl genrsa -des3 -out server.key 1024;
openssl req -new -key server.key -out server.csr;
cp server.key server.key.org;
openssl rsa -in server.key.org -out server.key;
openssl x509 -req -days 12000 -in server.csr -signkey server.key -out server.crt;
mv server.crt  /etc/apache2/ssl/cert.pem;
mv server.key  /etc/apache2/ssl/cert.key;
rm -f server.key.orig;
rm -f server.csr

J'ai deux questions:

  1. Comment puis-je ignorer l'invite de phrase secrète? Serait-il raisonnablement prudent pour moi de le faire? (comme dans ce ne devrait pas être carrément idiot comme n'importe qui devrait pouvoir pirater le certificat)

  2. Comment éviter les invites pour le nom du pays, l'organisation, etc. J'espère pouvoir leur donner l'invite de commande (la page de manuel ne montre que les options de niveau supérieur pour OpenSSL)

jww
la source

Réponses:

151

Edit: C’est de loin ma réponse la plus populaire, et cela fait maintenant quelques années que j’ai ajouté une variante ECDSA. Si vous pouvez utiliser ECDSA, vous devriez.


Vous pouvez fournir toutes ces informations sur la ligne de commande.

Génération de certificat auto-signé sans mot de passe en une étape:

Version RSA

openssl req \
    -new \
    -newkey rsa:4096 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

Version ECDSA

openssl req \
    -new \
    -newkey ec \
    -pkeyopt ec_paramgen_curve:prime256v1 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

Toutes les sous-commandes openssl ont leur propre page de manuel. Voir man req.


Répondant spécifiquement à vos questions et pour être plus explicite sur exactement quelles options sont en vigueur:

  1. L' -nodesindicateur signale qu'il ne faut pas chiffrer la clé, vous n'avez donc pas besoin de mot de passe. Vous pouvez également utiliser le -passout argdrapeau. Voir PASS PHRASE ARGUMENTSdans la openssl(1)page de manuel pour savoir comment formater l'arg.

  2. En utilisant le -subjdrapeau, vous pouvez spécifier le sujet (l'exemple est ci-dessus).

bahamat
la source
3
Lire des éléments via "-subj" fonctionne toutefois très bien, pour moi, uniquement lorsque OPENSSL_CONF n’est PAS défini. IOW: si OPENSSL_CONF est défini, OpenSSL essaiera de lire à partir de là et ignorera l' argument de ligne de commande "-subj". Il m'a fallu un certain temps pour comprendre.
Oberstet
oberstet: Oui, c'est vrai.
bahamat
Est-il possible de passer la clé de sujet elle-même à partir de stdin? J'ai essayé "-key stdin", "-key fd: 1" et "-key -" .. sans succès.
Oberstet
1
@ JeremyBaker: Non, vous aurez besoin d'un processus en deux étapes pour cela. Omettez le -x509et -dayspour générer une CSR au lieu d'un certificat, puis utilisez votre méthode de signature CA habituelle.
bahamat
1
@jww - et ce moment est venu. À partir de Chrome v58, lors de la tentative de chargement d'une page sécurisée mais que le certificat ne contient pas d'objet subjectAltName correspondant, il affiche une page d'erreur de confidentialité avec le message d'erreur "NET :: ERR_CERT_COMMON_NAME_INVALID". En cliquant sur le bouton Avancé, le message "... son certificat de sécurité provient de [missing_subjectAltName]"
Insomniac Software
11

L' -passinoption ne fait- elle pas l'affaire pour vous?

Avec la file:pathnameforme, vous pouvez être assez sûr avec les autorisations 600 pour ce fichier.

9000
la source
Vu l'option dans la page de manuel. On dirait que je peux avoir la phrase secrète de cette façon sans me demander. Merci!
Et avec -passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/…
andras.tim
5

La réponse acceptée nécessite quelques petites corrections. Lignes EC:

-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1

devrait être:

 -newkey ec \
 -pkeyopt ec_paramgen_curve:prime256v1 \

Sur MacOS - OpenSSL 1.0.2f installé via brew, j'ai vérifié la réponse acceptée comme décrit ci-dessous.

  • Pour lister les courbes elliptiques disponibles:

    $ openssl ecparam -list_curves
    
  • Pour générer un fichier de clé:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem
    
  • Pour générer le cert sans invite de mot de passe:

    openssl req \
        -new \
        -newkey ec:secp256k1.pem \
        -days 365 \
        -nodes \
        -x509 \
        -subj "/C=US/ST=FL/L=Ocala/O=Home/CN=example.com" \
        -keyout server.key \
        -out server.crt
    
  • Pour voir le cert:

    $ openssl x509 -noout -text -in server.crt
    
Andrei Sura
la source
En quoi est-ce différent de la réponse acceptée?
Ramhound
1
La seule différence importante est que je liste explicitement l'étape de génération du fichier pem. Les deux caractères \ manquent dans la réponse acceptée, ce qui m'a fait penser que la commande est incorrecte.
Andrei Sura
1
Vous voudrez peut-être mentionner ce fait. Si la réponse acceptée est effectivement incomplète et qu'il manque des caractères, il est important de souligner les différences et de préciser en quoi votre réponse contient des informations importantes.
Ramhound
3

Essayez la commande suivante:

openssl genrsa -des3 -out user.key -passout pass:foo 1024

La partie est sauter: -passout pass:foo.

Kenorb
la source
2

@bahamat a une excellente réponse. Malheureusement, certaines versions d’openssl génèrent une erreur lorsqu’on tente de créer un certificat ECDSA avec une seule commande. L'erreur va quelque chose comme:

routines:EVP_PKEY_CTX_ctrl:invalid operation:pmeth_lib.c:404

J'utilisais openssl 1.0.1e-fipssur CentOS 7.

La création de votre certificat avec les 3 commandes suivantes semble fonctionner:

openssl ecparam -genkey -name prime256v1 -out key.pem
openssl req -new -key key.pem -out csr.pem -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
openssl req -x509 -days 365 -key key.pem -in csr.pem -out certificate.pem
jxmallett
la source
La dernière ligne ne devrait-elle pas se terminer par server.crt?
ᴠɪɴᴄᴇɴᴛ