OpenSSL: Wie generiert man eine CSR mit interaktiv angeforderten alternativen Antragstellernamen (SANs)?

11

Ich möchte OpenSSL so konfigurieren, dass ich beim Ausführen openssl req -neweiner neuen Zertifikatsignierungsanforderung aufgefordert werde, alternative Betreffnamen in die CSR aufzunehmen.

Ich habe diese Zeile zum [req_attributes]Abschnitt meines hinzugefügt openssl.cnf:

subjectAltName                  = Alternative subject names

Dies hat den gewünschten Effekt, dass ich jetzt beim Generieren einer CSR zur Eingabe von SANs aufgefordert werde:

$ 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

Im obigen Beispiel habe ich eingegeben, DNS:alt1.example.comals ich zur Eingabe der SANs aufgefordert wurde.

Das Problem ist, dass die resultierende CSR nicht gut formatiert zu sein scheint:

$ 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 beschwert sich, dass der Wert des Attributs "Alternativer Betreffname" nicht gedruckt werden kann. Anhand von Online-Beispielen (bei denen Benutzer die SANs fest in ihre openssl.cnf codieren, anstatt sie wie gewünscht interaktiv aufzufordern) erwarte ich stattdessen Folgendes:

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

Wie kann ich also eine wohlgeformte CSR mit interaktiv angeforderten SANs generieren?

Maxy-B
quelle
Leider denke ich, dass es keine Lösung gibt, um dies mit "pure" zu tun openssl- Sie würden ein Skript benötigen, das die Konfigurationsdatei dafür entstellt. :( PS Eine bewährte Lösung, um dies auf nicht interaktive Weise zu tun, ist hier: stackoverflow.com/a/9158662/2693875
Greg Dubicki

Antworten:

4

Ich habe selbst mit diesem kleinen Nugget gekämpft ... was für eine PITA!

Meine Lösung: Ich habe die gesamte Datei openssl.cnf in eine Template Toolkit-Datei verschoben, wobei nur das Sans-Piece als Ersatzteil übrig blieb, und dann ein Perl-Skript darum gewickelt.

Das Perl-Skript fordert zur Eingabe der SANs-Einträge auf, fügt sie dann in die Vorlage ein, speichert die Vorlage in einer temporären Datei und rufe dann openssl req mit der Option -config auf, die auf die temporäre Datei zeigt. Verwerfen Sie die temporäre Datei, nachdem der CSR generiert wurde.

Vielleicht möchten Sie auch Folgendes ansehen: http://www.openssl.org/docs/apps/config.html

Es gibt andere, die $ ENV kurz vor der Ausführung überschreiben und den Aufruf von openssl req in Perl oder Shell umbrechen und dasselbe auf etwas effizientere Weise ausführen : http://blog.loftninjas.org/2008/11/11/ Konfigurieren von SSL-Anfragen mit Betreff Name mit OpenSL /

Paul Allen
quelle
Die $ ENV-Lösung hat bei mir nicht funktioniert. :(
Greg Dubicki
2

Ich suche auch nach einer Lösung. Und das ist, was Sie wollen:

[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]

Und Sie können dies erhalten, indem Sie nach alternativen Betreffnamen fragen :)

#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
quelle
Dies funktioniert beim Betrachten der CSR, aber wenn ich ein Zertifikat erstelle, wird das SAN nicht beibehalten.
Jess
Ist das Format für SAN korrekt? Durch Kommas getrennte Liste. Überprüfen Sie nur mit SAN-Präfix DNS, wenn nicht unterstützt IP, EMAIL. Beispiel: INPUT >>DNS:my.dns.com, DNS:my.otherdns.org
Raiserle
In Ordnung. Dies ist die normale Funktion von openssl wtf ! Sie müssen das SAN auch dem CABefehl -cand als -extensions <string>oder bereitstellen -extfile <file>. mta.openssl.org/pipermail/openssl-users/2016-January/…
Raiserle
1

Dieser "subjectAltName" sollte nicht in diesem Abschnitt enthalten sein: attribute = req_attributes. Aber in einem Abschnitt für req_extensions = (nenne es wie du willst).

Und keine Notwendigkeit für alle BS wie

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

Geben Sie einfach ein, was Sie wollen, wie viele Sie wollen:

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

(Der letzte macht internen Zugriff wie " https://192.168.1.2 " ohne Vorwarnung)

Also so etwas wie:

[ req ]
req_extensions     = my_extensions

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

Prost!

MXW
quelle
1
Dies ist NICHT das, wonach OP gefragt hat - er wollte eine interaktive Lösung.
Greg Dubicki
1
Sollten IPs nicht mit "IP: 192.168.1.2" aufgezeichnet werden, nicht mit einem Eintrag im DNS-Format? Ich habe diese Diskussion aus dem Jahr 2013 über Fehler zwischen Browsern bei der Verwendung von DNS oder IP zum Speichern von IP-Adressen als SANs zur Kenntnis genommen - michaelm.info/blog/?p=1281 - aber dieser Fehler sollte jetzt behoben sein.
Chris Woods