web-dev-qa-db-fra.com

Éviter le mot de passe Demander les clés et demander des informations sur le 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 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 puis-je éviter de demander le nom du pays, l'organisation, etc. J'espère pouvoir leur donner l'invite de commande (la page de manuel n'indique que les options de niveau supérieur pour OpenSSL)

87
JP19

Edit: C'est de loin ma réponse la plus populaire, et cela fait quelques années maintenant 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'indicateur -nodes indique de ne pas chiffrer la clé, vous n'avez donc pas besoin de mot de passe. Vous pouvez également utiliser l'indicateur -passout arg. VoirPASS PHRASE ARGUMENTSdans la page de manuel openssl(1) pour savoir comment formater l'arg.

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

146
bahamat

L'option -passin ne vous convient-elle pas?

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

10
9000

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 certificat 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
    
3
Andrei Sura

Essayez la commande suivante:

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

La partie qui saute est: -passout pass:foo.

2
kenorb

@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-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
jxmallett