OpenSSL: comment générer une CSR avec des noms alternatifs de sujets (SAN) sollicités de manière interactive?

11

Je souhaite configurer OpenSSL de sorte que lors de l'exécution openssl req -newpour générer une nouvelle demande de signature de certificat, je suis invité à indiquer d'autres noms de sujet à inclure dans le CSR.

J'ai ajouté cette ligne à la [req_attributes]section de mon openssl.cnf:

subjectAltName                  = Alternative subject names

Cela a l'effet souhaité que je suis maintenant invité à fournir des SAN lors de la génération d'un CSR:

$ openssl req -new -out test.csr -key ./test.key                            <<<
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:
State or Province Name (full name) [New York]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Example Co]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:test.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Alternative subject names []:DNS:alt1.example.com

Dans l'exemple ci-dessus, je suis entré DNS:alt1.example.comà l'invite des SAN.

Le problème est que le CSR résultant ne semble pas être bien formaté:

$ openssl req -text -in ./test.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=US, ST=New York, O=The Banes, CN=test.thebanes.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    [...]
                Exponent: 65537 (0x10001)
        Attributes:
            X509v3 Subject Alternative Name:unable to print attribute

OpenSSL se plaint de ne pas pouvoir imprimer la valeur de l'attribut Subject Alternative Name. À partir d'exemples en ligne (où les gens codent en dur les SAN dans leur openssl.cnf, plutôt que de les demander de manière interactive comme je le souhaite), je m'attends à voir ceci à la place:

        Attributes:
            X509v3 Subject Alternative Name:
                DNS:alt1.example.com

Alors, comment puis-je générer une CSR bien formée avec des SAN interactifs?

Maxy-B
la source
Malheureusement, je pense qu'il n'y a pas de solution pour le faire avec "pure" openssl- vous auriez besoin d'un script qui va modifier son fichier de configuration pour cela. :( PS Une solution éprouvée pour le faire de manière non interactive est ici: stackoverflow.com/a/9158662/2693875
Greg Dubicki

Réponses:

4

J'ai moi-même lutté avec cette petite pépite ... quel PITA!

Ma solution: j'ai déplacé tout le fichier openssl.cnf dans un fichier Template Toolkit en ne laissant que la pièce sans comme pièce de remplacement, puis j'ai enveloppé un script perl autour.

Le script perl demande les entrées SAN, puis les insère dans le modèle, enregistre le modèle dans un fichier temporaire, puis j'appelle la demande openssl avec l'option -config pointée vers le fichier temporaire. jetez le fichier temporaire une fois le CSR généré.

Vous pouvez également consulter: http://www.openssl.org/docs/apps/config.html

Il y en a d'autres qui remplacent $ ENV juste avant l'exécution et encapsulent l'appel à la demande openssl en perl ou shell et accomplissent la même chose de manière légèrement plus efficace: http://blog.loftninjas.org/2008/11/11/11/ configuration-ssl-requests-with-subjectaltname-with-openssl /

Paul Allen
la source
La solution $ ENV n'a pas fonctionné pour moi. :(
Greg Dubicki
2

Je cherche également une solution. Et voici ce que vous voulez:

[req]
default_bits      = 2048
default_key_file  = private.key.pem
...
...
attributes        = req_attributes

[req_attributes]
subjectAltName = Alternative DNS names, Email adresses or IPs (comma seperated list)
#optional default value
subjectAltName_default = DNS:myhost.com.au,IP:127.0.0.1,EMAIL:[email protected]

Et vous pouvez l'obtenir en vous demandant un ou plusieurs noms de sujet alternatifs :)

#openssl req -in mytest1/temp.csr.pem -noout -text
    Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=DE, ST=Sachsen, L=Heidenau, O=IT Rab\xC3\xB6se, OU=ssl
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:d8:cd:14:ca:d0:06:6c:8c:11:e9:52:bc:46:39:
                    c1:cf:5a:6e:dd:3b:a8:85:15:6b:13:82:82:4a:48:
                    cb:53:ea:70:ea:f4:02:b2:ef:b1:41:b2:d7:11:c7:
                    11:ba:07:1b:be:8c:30:bc:60:d2:82:83:a1:e1:19:
                    75:3b:69:03:01:3c:2b:7b:85:f4:2e:a9:58:68:8f:
                    0e:f4:5e:50:e1:3f:9e:cf:46:a0:eb:69:aa:1e:cb:
                    3a:99:cb:1d:93:60:d0:3b:38:96:87:45:19:51:f4:
                    40:72:e5:a7:5e:62:37:41:44:48:64:47:95:14:97:
                    4f:27:d0:0c:e7:6f:c1:e1:37
                Exponent: 65537 (0x10001)
        Attributes:
            X509v3 Subject Alternative Name:DNS:www.google.de,EMAIL:[email protected]
    Signature Algorithm: sha1WithRSAEncryption
        9d:2b:e4:eb:1b:c0:b6:0b:b4:62:a7:4d:01:68:98:68:36:98:
        1e:e9:bc:59:24:0f:1b:32:7b:da:9d:39:a4:0f:2c:70:3e:aa:
        f7:07:e7:6b:9b:3b:00:b3:71:e0:54:07:78:c7:6e:57:e3:89:
        07:e1:93:f1:77:e7:cc:0e:d0:ed:c5:d0:a3:5d:1a:cd:bb:d8:
        5f:64:25:81:1b:a8:2f:ef:c7:84:7a:f6:b8:52:4e:4c:1c:8d:
        83:b7:9b:02:8e:b2:39:68:a1:fe:f1:59:8b:e0:c4:91:f1:a9:
        c7:b3:82:a3:d2:92:2b:e5:79:9f:29:b6:63:e7:cf:9d:17:98:
        fe:70
raiserle
la source
Cela fonctionne quand on regarde le CSR, mais quand je crée un certificat, il ne garde pas le SAN.
Jess
Si le format est correct pour SAN? Liste séparée par des virgules. Vérifiez avec le préfixe DNS DNS uniquement, s'il n'est pas pris en charge IP, EMAIL. Exemple: INPUT >>DNS:my.dns.com, DNS:my.otherdns.org
raiserle
D'accord. C'est une fonction normale de openssl wtf ! Vous devez également fournir le SAN à la CAcommande-comme -extensions <string>, ou -extfile <file>. mta.openssl.org/pipermail/openssl-users/2016-January/…
raiserle
1

Ce "subjectAltName" ne devrait pas figurer dans cette section: attributes = req_attributes. Mais dans une section pour req_extensions = (appelez-la comme vous voulez).

Et pas besoin de tous les BS comme

subjectAltName           = Alternative subject names
subjectAltName_default   = DNS:www.g00gle.com

Tapez simplement ce que vous voulez, combien vous voulez:

subjectAltName = DNS:*.g00gle.com, DNS:g00gle.com, DNS:192.168.1.2

(Le dernier rend l'accès interne comme " https://192.168.1.2 " sans avertissement)

Donc quelque chose comme:

[ req ]
req_extensions     = my_extensions

[my_extensions]
subjectAltName     = DNS:*.g00gle.com, DNS:g00gle.com, DNS:192.168.1.2

À votre santé!

MXW
la source
1
Ce n'est PAS ce qu'OP a demandé - il voulait une solution interactive .
Greg Dubicki
1
Les adresses IP ne devraient-elles pas être enregistrées en utilisant "IP: 192.168.1.2", pas un enregistrement au format DNS? J'ai noté cette discussion de 2013 sur les bogues entre les navigateurs lors de l'utilisation de DNS ou IP pour stocker des adresses IP en tant que SAN - michaelm.info/blog/?p=1281 - mais ce bogue devrait maintenant être corrigé.
Chris Woods