Es gibt mehrere gute Antworten, die Beispiele dafür geben, wie dies funktioniert, aber keine, die erklären, wo bei Ihrem Versuch etwas schief gelaufen ist. OpenSSL kann manchmal ziemlich unintuitiv sein, es lohnt sich also, durchzugehen.
Nebenbei bemerkt, ignoriert OpenSSL standardmäßig alle Distinguished Name-Werte, die Sie in der Konfiguration angeben. Wenn Sie sie verwenden möchten, müssen Sie prompt = no
zu Ihrer Konfiguration hinzufügen . Darüber hinaus, wie der Befehl ein Zertifikat geschrieben erzeugt nur
Anforderung kein Zertifikat selbst, so dass der -days
Befehl nichts tut.
Wenn Sie Ihre Zertifikatsanforderung mit dem von Ihnen angegebenen Befehl generieren und das Ergebnis überprüfen, wird der Betreff-Alternativname angezeigt:
$ openssl req -new -key server.key -out server.csr -config config.cnf -sha256
$ openssl req -text -noout -in server.csr
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Alternative Name:
DNS:dev.mycompany.com
Signature Algorithm: sha256WithRSAEncryption
...
Wenn Sie dann das Zertifikat mit dem Befehl in heroku link generieren und das Ergebnis überprüfen, fehlt der Betreff-Alternativname:
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
$ openssl x509 -text -noout -in server.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
89:fd:75:26:43:08:04:61
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, ST = Massachusetts, L = Boston, O = MyCompany
Validity
Not Before: Jan 21 04:27:21 2018 GMT
Not After : Jan 21 04:27:21 2019 GMT
Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
...
Der Grund dafür ist, dass OpenSSL standardmäßig keine Erweiterungen von der Anforderung in das Zertifikat kopiert. Normalerweise wird das Zertifikat von einer Zertifizierungsstelle auf der Grundlage einer Kundenanforderung erstellt / signiert, und einige Erweiterungen können dem Zertifikat mehr Leistung verleihen, als die Zertifizierungsstelle beabsichtigt hat, wenn sie den in der Anforderung definierten Erweiterungen blind vertrauen.
Es gibt Möglichkeiten, OpenSSL anzuweisen, die Erweiterungen zu kopieren, aber es ist meiner Meinung nach mehr Arbeit, als nur die Erweiterungen in einer Konfigurationsdatei anzugeben, wenn Sie das Zertifikat generieren.
Wenn Sie versuchen sollten, Ihre vorhandene Konfigurationsdatei zu verwenden, funktioniert dies nicht, da der oberste Abschnitt markiert ist und [req]
diese Einstellungen nur für den Befehl req und nicht für den Befehl x509 gelten. Es ist nicht erforderlich, über eine Abschnittsmarkierung der obersten Ebene zu verfügen. Sie können also einfach die erste Zeile entfernen, und dann funktioniert dies sowohl für das Generieren von Anforderungen als auch für das Erstellen von Zertifikaten.
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
Alternativ können Sie das -x509
Argument für den req
Befehl verwenden, um ein selbstsigniertes Zertifikat in einem einzigen Befehl zu generieren, anstatt zuerst eine Anforderung und dann ein Zertifikat zu erstellen. In diesem Fall muss die
[req]
Abschnittszeile nicht entfernt werden, da dieser Abschnitt vom Befehl req gelesen und verwendet wird.
$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
Um es noch einmal zusammenzufassen, hier ist die geänderte Konfigurationsdatei, die in den obigen Befehlen verwendet wird:
default_bits = 2048
distinguished_name = dn
x509_extensions = san
req_extensions = san
extensions = san
prompt = no
[ dn ]
countryName = US
stateOrProvinceName = Massachusetts
localityName = Boston
organizationName = MyCompany
[ san ]
subjectAltName = DNS:dev.mycompany.com
-config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')