Ab Chrome 58 werden keine selbstsignierten Zertifikate mehr akzeptiert, für die Folgendes erforderlich ist Common Name
: https://productforums.google.com/forum/#!topic/chrome/zVo3M8CgKzQ;context-place=topicsearchin/chrome/category $ 3ACanary% 7Csort: relevance% 7Cspell: false
Stattdessen muss verwendet werden Subject Alt Name
. Ich habe zuvor diesen Leitfaden zur Erstellung eines selbstsignierten Zertifikats befolgt: https://devcenter.heroku.com/articles/ssl-certificate-self. Das hat sehr gut funktioniert, da ich die Dateien server.crt
und server.key
für das, was ich tue, benötigte. Ich muss jetzt neue Zertifikate generieren, die SAN
alle meine Versuche enthalten, dies zu tun, die mit Chrome 58 nicht funktioniert haben.
Folgendes habe ich getan:
Ich habe die Schritte in dem oben erwähnten Heroku-Artikel befolgt, um den Schlüssel zu generieren. Ich habe dann eine neue OpenSSL-Konfigurationsdatei geschrieben:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = san
extensions = san
[ req_distinguished_name ]
countryName = US
stateOrProvinceName = Massachusetts
localityName = Boston
organizationName = MyCompany
[ san ]
subjectAltName = DNS:dev.mycompany.com
Dann generierte das server.crt
mit folgendem Befehl:
openssl req \
-new \
-key server.key \
-out server.csr \
-config config.cnf \
-sha256 \
-days 3650
Ich bin auf einem Mac und habe die server.crt
Datei mit dem Schlüsselbund geöffnet und zu meinen Systemzertifikaten hinzugefügt. Ich habe es dann auf eingestellt Always Trust
.
Mit Ausnahme der Konfigurationsdatei zum Festlegen des SAN-Werts waren dies ähnliche Schritte, die ich in früheren Chrome-Versionen ausgeführt habe, um das selbstsignierte Zertifikat zu generieren und ihm zu vertrauen.
Danach bekomme ich allerdings noch die ERR_CERT_COMMON_NAME_INVALID
in Chrome 58.
quelle
-config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')
dev.company.name
zulocalhost
und dies funktionierte, um die lokale Entwicklungsseite von localhost zu bedienen. Unter macOS musste ich auch das Zertifikat zu Keychain hinzufügen und SSL auf "Always Trust" setzen.Speichern Sie dieses Skript unter Windows in Ihrem SSL-Ordner als makeCERT.bat. Es werden die folgenden Dateien erstellt: example.cnf, example.crt, example.key
quelle
Hier ist eine Lösung, die für mich funktioniert:
CA-Schlüssel und Zertifikat erstellen
Erstellen Sie server_rootCA.csr.cnf
Erstellen Sie die Konfigurationsdatei v3.ext
Serverschlüssel erstellen
Erstellen Sie ein Server-Zertifikat
Fügen Sie cert und key zur Apache2-Site-Datei, Abschnitt HTTPS (Port 443), hinzu
Kopieren Sie server_rootCA.pem vom Server auf Ihren Computer.
.. und zum Chromium-Browser hinzufügen
SIE SIND ALLE FERTIG!
PS Anstatt ein funktionsfähiges CA- und Server-Zertifizierungspaar zu erstellen (gemäß den obigen Anweisungen), können Sie einfach HSTS-Header in Ihrer HTTP-Serverkonfiguration deaktivieren. Dadurch wird verhindert, dass Chromium HTTPS erzwingt, und Benutzer können auf "Erweitert → Weiter mit Ihrer URL (unsicher)" klicken, ohne das benutzerdefinierte CA-Zertifikat (server_rootCA.pem) anfordern und installieren zu müssen. Mit anderen Worten: Wenn Sie HSTS deaktivieren müssen, kann Ihre Site über HTTP und / oder eine unsichere HTTPS-Verbindung öffentlich angezeigt werden (Vorsicht!).
Fügen Sie für Apache2 der Site-Datei den folgenden Abschnitt hinzu: HTTP (Port 80)
Getestet auf Debian / Apache2.4 + Debian / Chromium 59
https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58
quelle
-config <( cat server_rootCA.csr.cnf )
anstatt nur verwendet-config server_rootCA.csr.cnf
?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:
Wenn Sie dann das Zertifikat mit dem Befehl in heroku link generieren und das Ergebnis überprüfen, fehlt der Betreff-Alternativname:
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.Alternativ können Sie das
-x509
Argument für denreq
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.Um es noch einmal zusammenzufassen, hier ist die geänderte Konfigurationsdatei, die in den obigen Befehlen verwendet wird:
quelle
Meine Lösung besteht darin, das Wesentliche
openssl.cnf
so zu belassen, wie es ist, und am Ende einen neuen Abschnitt hinzuzufügen,[ cert_www.example.com ]
in dem beispielsweise www.example.com die Website ist, für die ich ein Zertifikat erstellensubjectAltName
möchte noch etwas). Natürlich kann der Abschnitt beliebig benannt werden.Danach kann ich den
openssl req
Befehl wie zuvor ausführen , indem ich nur-extensions cert_www.example.com
den Inhalt hinzufüge-subj
, der abgerufen werden soll, und füge hinzu, dass alle DN-Informationen direkt hinzugefügt werden.Vergessen Sie nicht, den Inhalt des Zertifikats nach seiner Erstellung und vor seiner Verwendung mit zu überprüfen
openssl x509 -text
quelle
Bash-Skript mit eingebauter Konfiguration
Als Shell-Skript, das plattformübergreifend mit bash funktionieren soll. Nimmt
HOSTNAME
env set für die Shell an oder liefert einen Hostnamen Ihrer Wahl, zself_signed_cert.sh test
Das obige fügt mehr oder weniger das Nötigste ein, was die Konfigurationsdatei info openssl benötigt.
Hinweis: Wird
DNS:localhost
als SAN mitgeliefert , um das Testen über localhost zu vereinfachen. Entfernen Sie dieses zusätzliche Bit aus dem Skript, wenn Sie es nicht möchten.Kredit
Die Antwort von bcardarella ist großartig (kann wegen unzureichender Wiederholung nicht kommentieren / up-vote). Die Antwort verwendet jedoch einen vorhandenen plattformspezifischen Speicherort für die Konfigurationsdatei von openssl ... daher:
Offensichtlich müsste man einfach die openssl-Konfigurationsdatei für die von Ihnen angegebene Plattform finden und den richtigen Speicherort angeben.
Prüfung
Importieren Sie zum Testen
test.cert.pem
in die Chrome-Berechtigungen inchrome://settings/certificates
und:Und nach dem Testen
quelle