Justus Blümer

Selbst signiertes SSL Zertifikat auf macOS Sierra generieren, das mit Chrome 58+ funktioniert

Bei der Entwicklung von Websites, die in ihrer Live-Umgebung per HTTPS ausgeliefert werden, ist es umständlich, in der lokalen Entwicklungsumgebung nur HTTP zu nutzen. Deshalb habe ich mir mit der Anleitung Local SSL websites on macOS Sierra ein lokales, selbst signiertes SSL Zertifikat eingerichtet, sodass ich mich nicht länger um unterschiedliche Protokolle kümmern muss.
Achtung: Die oben verlinkte Anleitung enthält einen kleinen, aber folgenschweren Tippfehler, deswegen bitte den Kommentar von aplaceforallmystuff beachten.

Das hat eine ganze Weile gut funktioniert bis im Frühjahr 2017 Chrome in der Version 58 den Umgang mit SSL-Zertifikaten geändert hat. Das Resultat war, dass im Chrome statt der tatsächlichen Seite nur der Fehler ERR_CERT_COMMON_NAME_INVALID angezeigt wurde.
Das liegt daran, dass es seit dieser Änderung für den Chrome nicht mehr ausreicht, wenn im Zertifikat nur die Information „commonName“ enthalten ist – stattdessen ist jetzt ebenfalls die Information „subjectAltName“ zwingend erforderlich. Sie enthält ähnlich wie commonName den Hostnamen der Website, für die das Zertifikat ausgestellt wird mit dem Unterschied, dass commonName nur einen enthält, während subjectAltName eine Liste sein kann.

Nach ewigem Herumprobieren und Googlen habe ich die Lösung bei Serverfault.com gefunden. Die Schritte waren:

Zertifikat & Key generieren

openssl req \
    -newkey rsa:2048 \
    -x509 \
    -nodes \
    -keyout server.key \
    -new \
    -out server.crt \
    -subj /CN=dev.mycompany.com \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat /System/Library/OpenSSL/openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')) \
    -sha256 \
    -days 3650

Die Vorkommen von dev.mycompany.com müssen mit dem Hostnamen des Entwicklungssystems ersetzt werden, in meinem Fall ist das schlicht localhost.

Zertifikat und Schlüssel zum Webserver kopieren

Entsprechend der oben verlinkten Anleitung ist das bei mir /private/etc/apache2/ssl

Webserver neustarten

sudo apachectl restart

Zertifikat in Schlüsselbundverwaltung importieren

  1. Das zuvor generierte Zertifikat (.crt) mit der macOS Schlüsselbundverwaltung öffnen und als Systemzertifikat importieren
  2. Vertrauenseinstellung auf „Immer vertrauen“ setzen. Am schnellsten geht das, wenn man in der Schlüsselbundverwaltung nach dem zertifizierten Hostnamen sucht und dann in der Liste doppelklickt

Chrome neustarten

Bei mir war es nicht notwendig, ich habe aber häufig gelesen, dass noch ein Neustart notwendig sein kann, falls es also nicht sofort klappt, kann das evtl. helfen.