Question Eviter l'invite de mot de passe pour les clés et les invites pour les informations DN


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 raisonnable pour moi de le faire? (comme cela ne devrait pas être complètement idiot comme n'importe qui devrait pouvoir pirater le certificat)

  2. Comment puis-je éviter les invites pour le nom du pays, l'organisation, etc. J'espère pouvoir les donner à l'invite de commande (la page de manuel affiche uniquement les options de niveau supérieur pour OpenSSL)


82
2017-12-27 17:39


origine




Réponses:


Modifier: C'est de loin ma réponse la plus populaire, et cela fait quelques années maintenant, j'ai donc 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 sans mot de passe auto-signé 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épondre spécifiquement à vos questions et être plus explicite sur les options en vigueur:

  1. le -nodes signaler les signaux pour ne pas chiffrer la clé, vous n'avez donc pas besoin d'un mot de passe. Vous pouvez également utiliser le -passout arg drapeau. Voir PASS PHRASE ARGUMENTS dans le openssl(1) page de man pour comment formater l'arg.

  2. En utilisant le -subj flag vous pouvez spécifier le sujet (exemple ci-dessus).


136
2017-12-27 19:44



Lire des choses via "-subj" fonctionne bien, cependant - 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 ignorer Argument de ligne de commande "-subj". Il m'a fallu du temps pour comprendre. - oberstet
oberstet: oui, c'est vrai. - bahamat
Est-il possible de passer le sujet clé lui-même de stdin? J'ai essayé "-key stdin", "-key fd: 1" et "-key -" .. sans succès. - oberstet
@ JeremyBaker: Non, vous aurez besoin d'un processus en deux étapes pour cela. Omettre le -x509 et -days Pour générer un CSR au lieu d'un certificat, utilisez votre méthode de signature CA habituelle. - bahamat
@jww - et ce moment est venu. À partir de Chrome v58, lorsque vous tentez de charger une page sécurisée mais que le certificat ne contient pas subjectAltName correspondant, une page d'erreur de confidentialité contenant le message d'erreur "NET :: ERR_CERT_COMMON_NAME_INVALID" s'affiche. En cliquant sur le bouton avancé, le message "... son certificat de sécurité provient de [missing_subjectAltName]" - Insomniac Software


Ne pas -passin option faire le tour pour vous?

Avec file:pathname form, vous pouvez être tout à fait en sécurité avec des autorisations 600 pour ce fichier.


7
2017-12-27 19:54



Vu l'option dans la page de manuel. On dirait que je peux avoir la phrase secrète de cette façon sans demander. Merci!


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

-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 l'invite cert sans 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
    

2
2018-06-08 19:28



En quoi est-ce différent de la réponse acceptée? - Ramhound
La seule différence importante est que je liste explicitement l'étape de génération du fichier pem. La réponse acceptée manque les deux caractères et cela m'a fait penser que la commande est incorrecte. - Andrei Sura
Vous voudrez peut-être mentionner ce fait. Si la réponse acceptée est en effet incomplète et qu'il manque des caractères, il est important de souligner les différences et la manière dont votre réponse contient des informations importantes. - Ramhound


@bahamat a une excellente réponse. Malheureusement, certaines versions de openssl génèrent une erreur lors de la tentative de création d'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-fips sur 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

1
2018-02-20 08:06



La dernière ligne ne devrait-elle pas se terminer par server.crt? - ᴠɪɴᴄᴇɴᴛ


Essayez la commande suivante:

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

La partie à sauter est la suivante: -passout pass:foo.


0
2018-01-16 17:16