web-dev-qa-db-fra.com

OpenSSL génère différents types de certificats auto-signés

Quelqu'un sait-il comment utiliser OpenSSL pour générer des certificats pour les types de clé publique suivants:

  1. DSA - Pour DHE_DSS échange de clés.
  2. Diffie-Hellman - Pour DH_DSS et DH_RSA échange de clés.
  3. ECDH - Pour ECDH_ECDSA et ECDH_RSA échange de clés.
  4. ECDSA - Pour ECDHE_ECDSA échange de clés.

Cependant, la plupart des informations que je peux trouver en ligne vous apprennent à générer un certificat de type RSA.

20
Ryu

(EC) DSA

Pour une paire de clés DSA, utilisez ceci:

openssl dsaparam -out dsakey.pem -genkey 1024

où "1024" est la taille en bits. La première norme DSA exigeait que la taille soit un multiple de 64, dans la plage 512..1024. Ensuite, une autre version a déconseillé des tailles inférieures à 1024, donc une taille de clé DSA valide avait une longueur de 1024 bits et rien d'autre. version actuelle spécifie qu'une clé DSA valide a une longueur de 1024, 2048 ou 3072 bits. OpenSSL accepte d'autres longueurs. Si vous souhaitez maximiser l'interopérabilité, utilisez 1024 bits.

Pour une paire de clés ECDSA, utilisez ceci:

openssl ecparam -genkey -out eckey.pem -name prime256v1

Pour voir quels noms de courbe sont pris en charge par OpenSSL, utilisez: openssl ecparam -list_curves

(Pour une interopérabilité optimale, respectez la courbe NIST P-256, que OpenSSL connaît sous le nom de "prime256v1".)

Une fois que vous avez une paire de clés DSA ou ECDSA, vous pouvez générer un certificat auto-signé contenant la clé publique et signé avec la clé privée:

openssl req -x509 -new -key dsakey.pem -out cert.pem

(Remplacez "dsakey.pem" par "eckey.pem" pour utiliser la clé EC générée ci-dessus.)


(CE) DH

Pour Diffie-Hellman (avec ou sans courbes elliptiques), les choses sont plus complexes, car DH n'est pas un algorithme de signature:

  • Vous ne pourrez pas produire de certificat auto-signé avec une clé DH.
  • Vous ne pouvez pas non plus faire une demande PKCS # 10 pour un certificat avec une clé DH, car une demande PKCS # 10 est censée être auto-signée (cette auto-signature est utilisée comme preuve de possession ).

Alors que OpenSSL, la bibliothèque , a le support nécessaire pour émettre un certificat qui contient une clé publique DH; cette page peut contenir des pointeurs. Le défi est de convaincre OpenSSL, l'outil de ligne de commande , de le faire. Dans la jungle de la documentation OpenSSL, je n'ai pas trouvé de moyen complet de le faire. Les paires de clés sont cependant assez faciles à générer.

Pour générer une paire de clés DH, avec l'outil de ligne de commande OpenSSL, vous devez le faire en deux étapes:

openssl dhparam -out dhparam.pem 1024
openssl genpkey -paramfile dhparam.pem -out dhkey.pem

Pour une paire de clés ECDH, utilisez ceci:

openssl ecparam -out ecparam.pem -name prime256v1
openssl genpkey -paramfile ecparam.pem -out ecdhkey.pem

Cependant, il se trouve que le format des certificats contenant des clés publiques ECDH est complètement identique au format des certificats contenant des clés publiques ECDSA; en effet, le format contient "une clé publique EC" sans indication de l'algorithme prévu (ECDH ou ECDSA). Par conséquent, toute clé privée et tout certificat pour ECDSA (clé privée pour générer des signatures ECDSA, certificat auto-signé ou signé par toute autre autorité de certification) conviendra aux suites de chiffrement ECDH- *.

Le seul cas que je ne sais pas produire avec l'outil de ligne de commande OpenSSL est un certificat Diffie-Hellman statique (non-EC). Notez cependant qu'OpenSSL ne prend pas en charge SSL/TLS avec les suites de chiffrement DH statiques, donc même si vous pouviez produire le certificat, cela ne fonctionnerait pas avec OpenSSL.

(Et, en fait, personne n'utilise la DH statique dans la pratique.)

26
Tom Leek

Je drague juste une vieille question. J'ai récemment eu besoin de créer un certificat DH à des fins de test. Voici comment le faire. Créez d'abord les paramètres DH et la clé privée selon la réponse de Tom:

openssl dhparam -out dhparam.pem 1024
openssl genpkey -paramfile dhparam.pem -out dhkey.pem

Créez ensuite le fichier de clé publique:

openssl pkey -in dhkey.pem -pubout -out dhpubkey.pem

Vous avez maintenant besoin d'un fichier CSR. Les CSR sont auto-signés, ce qui ne peut évidemment pas être fait pour DH car DH n'est pas un algorithme de signature. Mais créez-en quand même une pour une clé différente (une qui peut signer, par exemple RSA). Pour créer une clé RSA et une CSR associée:

openssl genrsa -out rsakey.pem 1024
openssl req -new -key rsakey.pem -out rsa.csr

Enfin, vous générez le certificat DH à partir de la RSA CSR et de la clé publique DH. Il n'est pas possible de créer un certificat DH auto-signé car (comme indiqué ci-dessus) DH n'est pas un algorithme de signature. Par conséquent, vous devrez avoir configuré un certificat/clé d'autorité de certification. Dans cet exemple, je suppose que vous avez déjà créé un CAkey.pem et CAcert.pem:

openssl x509 -req -in rsa.csr -CAkey CAkey.pem -CA CAcert.pem -force_pubkey dhpubkey.pem -out dhcert.pem -CAcreateserial

Votre certificat DH sera dans dhcert.pem

8
Matt Caswell