Ungültiges selbstsigniertes SSL-Zertifikat - "Betreff Alternativer Name fehlt"

96

Vor kurzem hat Chrome die Arbeit mit meinen selbstsignierten SSL-Zertifikaten eingestellt und hält sie für unsicher. Wenn ich mir das Zertifikat auf der DevTools | SecurityRegisterkarte ansehe , kann ich sehen, dass es steht

Alternativer Betreffname fehlt Das Zertifikat für diese Site enthält keine alternative Betreffname-Erweiterung, die einen Domänennamen oder eine IP-Adresse enthält.

Zertifikatfehler Es gibt Probleme mit der Zertifikatkette der Site (net :: ERR_CERT_COMMON_NAME_INVALID).

Wie kann ich das beheben?

Brad Parks
quelle
33
Wie ist das nicht eine Programmierfrage
Sweet Chilly Philly
1
CN=www.example.comist wahrscheinlich falsch. Hostnamen werden immer im SAN gespeichert . Wenn es im CN vorhanden ist , muss es auch im SAN vorhanden sein (in diesem Fall müssen Sie es zweimal auflisten). Weitere Regeln und Gründe finden Sie unter Wie signieren Sie eine Zertifikatsignierungsanforderung bei Ihrer Zertifizierungsstelle und wie erstellen Sie ein selbstsigniertes Zertifikat mit openssl? Sie müssen das selbstsignierte Zertifikat auch im entsprechenden Trust Store ablegen.
JWW
@jww - Dies ist kein Duplikat dieser Frage, da Sie kein Zertifikat mit openssl erstellen müssen, sondern es mit anderen Tools erstellen können.
Brad Parks
1
@BradParks - Hmmm ... Die Frage wurde mit OpenSSL markiert und die akzeptierte Antwort verwendet OpenSSL. Ich habe das OpenSSL-Tag erneut geöffnet und entfernt.
JWW

Antworten:

104

Um dies zu beheben, müssen Sie opensslbeim Erstellen des Zertifikats grundsätzlich einen zusätzlichen Parameter angeben

-sha256 -extfile v3.ext

wo v3.extist eine Datei , wie so mit %%DOMAIN%%ersetzt mit dem gleichen Namen , den Sie als Ihre verwenden Common Name. Mehr Infos hier und hier . Beachten Sie, dass Sie normalerweise das Common Nameund %%DOMAIN%%auf die Domäne festlegen, für die Sie ein Zertifikat generieren möchten. Wenn ja www.mysupersite.com, würden Sie das für beide verwenden.

v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = %%DOMAIN%%

Hinweis: Skripte, die dieses Problem beheben und vollständig vertrauenswürdige SSL-Zertifikate zur Verwendung in Chrome, Safari und von Java-Clients erstellen, finden Sie hier

Ein weiterer Hinweis : Wenn Sie nur versuchen möchten, zu verhindern, dass Chrome beim Anzeigen eines selbstsignierten Zertifikats Fehler auslöst, können Sie Chrome anweisen, alle SSL-Fehler für ALLE Websites zu ignorieren, indem Sie es mit einer speziellen Befehlszeilenoption starten, wie hier beschrieben auf SuperUser

Brad Parks
quelle
2
Sie sind sich nicht sicher, welche Version von XAMPP Sie verwenden. Wenn Sie jedoch in dieser Datei nach einer Zeile suchen, die "openssl x509" enthält, sollten Sie in der Lage sein, die obigen Angaben am Ende dieser Zeile in der Datei hinzuzufügen. Zum Beispiel hat diese Version von makecert.bat es in Zeile 9 und würde am Ende sein : bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. Natürlich müssen Sie das noch v3.ext in einer Datei im selben Ordner speichern.
Brad Parks
1
Nachdem ich alles ausprobiert hatte, gab ich Chrome auf und fuhr mit einem anderen Browser fort. Wenige Tage später habe ich heute mit Chrom nachgesehen und es funktioniert !!! Chrome hatte wahrscheinlich einen Fehler und sie haben ihn behoben. Ihre Methode für Subject Alternative Name Missing funktioniert !!!! Fügen Sie einfach die unter vertrauenswürdigen Stammzertifikaten zertifizierten Zertifikate im Browser hinzu.
Tarik
35
Ich bekomme unknown option -extfile. Wie behebe ich das?
Nick Manning
2
@NickManning - Vielleicht verwenden Sie die extfileDirektive im falschen Befehl openssl? Anstatt es in zu verwenden openssl req -new ..., wird es in verwendet openssl x509 -req .... Zumindest hat das hier jemand gesagt , was aus dem Beispiel hervorgeht, das ich in einer anderen Antwort auf eine ähnliche Frage zur vollständigen Generierung dieser Zertifikate habe
Brad Parks
2
"Geben Sie einen zusätzlichen Parameter an openssl an" Zu welchem ​​Befehl speziell? Es gibt mehrere Schritte und diese Antwort ist zu vage: ibm.com/support/knowledgecenter/de/SSWHYP_4.0.0/…
user145400
34

Folgende Lösung hat bei mir auf Chrom 65 ( ref ) funktioniert -

Erstellen Sie eine OpenSSL-Konfigurationsdatei (Beispiel: req.cnf)

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = www.company.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.company.com
DNS.2 = company.com
DNS.3 = company.net

Erstellen Sie das Zertifikat, das auf diese Konfigurationsdatei verweist

openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
 -keyout cert.key -out cert.pem -config req.cnf -sha256
Anshul
quelle
2
Das ist toll! Genau das, was ich brauchte, und es überspringt die nervigen Eingabeaufforderungen für Dinge wie Firmenname und -status und so weiter.
Coredumperror
2
Ich habe einige alternative Lösungen ausprobiert, aber dies ist die einzige, die für mich funktioniert hat. Vielen Dank!!
Mirko
1
Sie können den Betreff über eine Befehlszeile übergeben: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Jaroslav Záruba
Wie haben Sie in Chrom importiert? Fehlt hier basicConstraints = CA:truenicht?
Woodz
19

Bash Script

Ich habe ein Bash-Skript erstellt , um das Generieren von selbstsignierten TLS-Zertifikaten zu vereinfachen, die in Chrome gültig sind.

Getestet Chrome 65.xund es funktioniert immer noch. Stellen Sie sicher, dass Sie Chrome nach der Installation neuer Zertifikate neu starten.

chrome://restart



Andere Ressourcen

Ein weiteres (viel robusteres) Tool, das es wert ist, überprüft zu werden, ist das CloudFlare- cfsslToolkit:

Logan
quelle
2
Sie sollten das Skript hier hinzufügen und erklären.
JWW
Scheint wie ein schönes Drehbuch. Ein Skript liefert jedoch keine (direkte) Antwort auf das Problem des OP. Vielleicht erklären Sie auch, was sein Problem ist.
bshea
4

Ich benutze einfach den -subjParameter, der die IP-Adresse des Computers hinzufügt. Also nur mit einem Befehl gelöst.

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -sha256 -subj '/CN=my-domain.com/subjectAltName=DNS.1=192.168.0.222/' -keyout my-domain.key -out my-domain.crt

Sie können andere Attribute wie C, ST, L, O, OU, emailAddress hinzufügen, um Zertifikate zu generieren, ohne dazu aufgefordert zu werden.

Ludwig
quelle
2
funktioniert nicht für. es scheint, dass Chrom SAN auf diese Weise nicht erkennt
Mononoke
Ich habe "Probleme beim Erstellen einer Zertifikatanforderung" unter OpenSSL 1.1.0b mit diesem Befehl.
Rick
Für mich (Windows) arbeitete eine etwas andere Syntax: openssl.exe req -x509 -sha256 -newkey rsa:2048 -keyout certificate.key -out certificate.crt -days 365 -nodes -subj "/CN=my.domain.com" -addext "subjectAltName=DNS:my.domain.com" IIS benötigt dann *.pfxFormat:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
Štěpán Havránek
3

Ich hatte so viele Probleme damit, selbstsignierte Zertifikate für MacOS / Chrome zu erhalten. Schließlich fand ich Mkcert: "Ein einfaches Zero-Config-Tool zum Erstellen lokal vertrauenswürdiger Entwicklungszertifikate mit beliebigen Namen." https://github.com/FiloSottile/mkcert

Anthony
quelle
Es funktioniert auch unter Windows 10 in neuem Chrome. Obwohl ich PEM-Dateien aus dem Standardordner Windows \ system32 in einen anderen kopieren musste, kann Nginx nicht auf diesen Ordner zugreifen.
Vatavale
2
  • Erstellen Sie eine Kopie Ihrer OpenSSL-Konfiguration in Ihrem Home-Verzeichnis:

    cp /System/Library/OpenSSL/openssl.cnf ~/openssl-temp.cnf
    

    oder unter Linux:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • Fügen Sie openssl-temp.cnfunter [v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    Ersetzen Sie localhostdurch die Domäne, für die Sie dieses Zertifikat generieren möchten.

  • Zertifikat generieren:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
        -config ~/openssl-temp.cnf
        -keyout /path/to/your.key -out /path/to/your.crt
    

Sie können dann löschen openssl-temp.cnf

Vic Seedoubleyew
quelle
1

Ich konnte (net :: ERR_CERT_AUTHORITY_INVALID) durch Ändern des DNS.1-Werts der v3.ext-Datei entfernen

[alt_names] DNS.1 = domainname.com

Ändern Sie domainname.com mit Ihrer eigenen Domain.

Jun See
quelle
0

Auf MAC ab Chrome Version 67.0.3396.99 funktioniert mein selbstsigniertes Zertifikat nicht mehr.

Die Regeneration mit all dem, was hier geschrieben wurde, hat nicht funktioniert.

AKTUALISIEREN

hatte die Gelegenheit zu bestätigen, dass mein Ansatz heute funktioniert :). Wenn es bei Ihnen nicht funktioniert, stellen Sie sicher, dass Sie diesen Ansatz verwenden

v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = <specify-the-same-common-name-that-you-used-while-generating-csr-in-the-last-step>
$

kopiert von hier https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

END UPDATE

schließlich konnte grün Sichere nur sehen , wenn entfernt mein cert von System , und hinzugefügt , es zu lokalen Schlüsselanhängern. (Wenn es eine gibt - lassen Sie sie zuerst fallen). Ich bin mir nicht sicher, ob es wichtig ist, aber in meinem Fall habe ich das Zertifikat über Chrome heruntergeladen und überprüft, ob das Erstellungsdatum heute ist - es ist also das, das ich gerade erstellt habe.

Ich hoffe, es ist hilfreich für jemanden, der gerne einen Tag damit verbringt.

Chrome niemals aktualisieren!

user2932688
quelle
0

Hier ist eine sehr einfache Möglichkeit, ein IP-Zertifikat zu erstellen, dem Chrome vertraut.

Die Datei ssl.conf ...

[ req ]
default_bits       = 4096
distinguished_name = req_distinguished_name
req_extensions     = req_ext
prompt             = no

[ req_distinguished_name ]
commonName                  = 192.168.1.10

[ req_ext ]
subjectAltName = IP:192.168.1.10

Wobei natürlich 192.168.1.10 die lokale Netzwerk-IP ist, der Chrome vertrauen soll.

Erstellen Sie das Zertifikat:

openssl genrsa -out key1.pem
openssl req -new -key key1.pem -out csr1.pem -config ssl.conf
openssl x509 -req -days 9999 -in csr1.pem -signkey key1.pem -out cert1.pem -extensions req_ext -extfile ssl.conf
rm csr1.pem

Importieren Sie unter Windows das Zertifikat auf allen Clientcomputern in den Trusted Root Certificate Store. Laden Sie auf Android Phone oder Tablet das Zertifikat herunter, um es zu installieren. Jetzt vertraut Chrome dem Zertifikat unter Windows und Android.

Unter Windows Dev Box ist der beste Ort, um openssl.exe abzurufen, "c: \ Programme \ Git \ usr \ bin \ openssl.exe".

AQuirky
quelle
0

Wenn Sie Ihren Server localhost ausführen möchten, müssen Sie Setup CN = localhostund DNS.1 = localhost.

[req]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
prompt = no
prompt = no
x509_extensions = v3_req

[req_distinguished_name]
C = BR
CN = localhost
[email protected]
L = Sao Paulo
O = example.com
OU = example.com
ST = Sao Paulo

[v3_req]
authorityKeyIdentifier = keyid, issuer
basicConstraints = CA:FALSE
extendedKeyUsage = serverAuth
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
Washington Botelho
quelle