Od Chrome 58 nie akceptuje już certyfikatów z podpisem własnym, które polegają na Common Name
: https://productforums.google.com/forum/#!topic/chrome/zVo3M8CgKzQ;context-place=topicsearchin/chrome/category $ 3ACanary% 7Csort: trafność% 7Cspell: false
Zamiast tego wymaga użycia Subject Alt Name
. Wcześniej postępowałem zgodnie z tym przewodnikiem na temat generowania samopodpisanego certyfikatu: https://devcenter.heroku.com/articles/ssl-certificate-self, który działał świetnie, ponieważ wymagałem plików server.crt
i server.key
plików do tego, co robię. Muszę teraz wygenerować nowe certyfikaty, które obejmują SAN
jednak wszystkie moje próby, aby to zrobić, nie działały z Chrome 58.
Oto co zrobiłem:
Wykonałem kroki z wyżej wymienionego artykułu Heroku, aby wygenerować klucz. Następnie napisałem nowy plik konfiguracyjny OpenSSL:
[ 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
Następnie wygenerowano za server.crt
pomocą następującego polecenia:
openssl req \
-new \
-key server.key \
-out server.csr \
-config config.cnf \
-sha256 \
-days 3650
Jestem na komputerze Mac, więc otworzyłem server.crt
plik za pomocą pęku kluczy i dodałem go do moich certyfikatów systemowych. Następnie ustawiłem na Always Trust
.
Z wyjątkiem pliku konfiguracyjnego do ustawienia wartości SAN były to podobne kroki, których użyłem we wcześniejszych wersjach Chrome do wygenerowania i zaufania do samopodpisanego certyfikatu.
Jednak po tym nadal dostaję ERR_CERT_COMMON_NAME_INVALID
w Chrome 58.
źródło
-config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')
dev.company.name
sięlocalhost
i to pracował dla obsługujących lokalną witrynę rozwojowej z localhost. W systemie macOS musiałem również dodać certyfikat do pęku kluczy i ustawić SSL na „Zawsze ufaj”.W systemie Windows zapisz ten skrypt w folderze SSL jako makeCERT.bat. Utworzy te pliki: example.cnf, example.crt, example.key
źródło
Oto rozwiązanie, które działa dla mnie:
Utwórz klucz CA i certyfikat
Utwórz server_rootCA.csr.cnf
Utwórz plik konfiguracyjny v3.ext
Utwórz klucz serwera
Utwórz certyfikat serwera
Dodaj certyfikat i klucz do pliku strony Apache2, sekcja HTTPS (port 443)
Skopiuj server_rootCA.pem z serwera na komputer.
.. i dodaj go do przeglądarki Chromium
WSZYSTKO ZROBIŁEŚ!
PS Zamiast tworzyć funkcjonalną parę certyfikatów CA i serwera (zgodnie z powyższymi instrukcjami) możesz po prostu wyłączyć nagłówki HSTS w konfiguracji serwera HTTP. Uniemożliwi to Chromium wymuszanie HTTPS i pozwoli użytkownikom kliknąć „Zaawansowane → przejdź do twojego.url (niebezpieczne)” bez konieczności uzyskiwania i instalowania niestandardowego certyfikatu CA (server_rootCA.pem). Innymi słowy - wyłączenie HSTS pozwoli na publiczne wyświetlanie Twojej witryny przez HTTP i / lub niezabezpieczone połączenie HTTPS (uwaga!).
W przypadku Apache2 dodaj następującą sekcję do pliku strony, sekcja HTTP (port 80)
Testowane na Debian / Apache2.4 + Debian / Chromium 59
https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58
źródło
-config <( cat server_rootCA.csr.cnf )
zamiast po prostu-config server_rootCA.csr.cnf
?Istnieje kilka świetnych odpowiedzi, które podają przykłady, jak to zrobić, ale żadne nie wyjaśniają, co poszło nie tak podczas próby. OpenSSL może być czasami nieintuicyjny, dlatego warto przejść.
Po pierwsze, OpenSSL domyślnie ignoruje wszelkie wartości nazw wyróżniających podane w konfiguracji. Jeśli chcesz ich użyć, musisz dodać je
prompt = no
do swojej konfiguracji. Ponadto polecenie w formie pisemnej generuje tylko żądanie certyfikatu, a nie sam certyfikat, więc-days
polecenie nic nie robi.Jeśli generujesz żądanie certyfikatu za pomocą tego polecenia, które podałeś i sprawdzasz wynik, obecna jest alternatywna nazwa podmiotu:
Ale jeśli wygenerujesz certyfikat za pomocą polecenia w łączu heroku i sprawdzisz wynik, brak będzie alternatywnej nazwy podmiotu:
Powodem jest to, że domyślnie OpenSSL nie kopiuje rozszerzeń z żądania do certyfikatu. Zwykle certyfikat zostałby utworzony / podpisany przez urząd certyfikacji na podstawie żądania od klienta, a niektóre rozszerzenia mogłyby przyznać certyfikatowi większą moc niż zamierzał urząd certyfikacji, gdyby ślepo ufali rozszerzeniom zdefiniowanym w żądaniu.
Istnieją sposoby, aby powiedzieć OpenSSL, aby skopiowało rozszerzenia, ale IMHO to więcej pracy niż zwykłe udostępnianie rozszerzeń w pliku konfiguracyjnym podczas generowania certyfikatu.
Jeśli spróbujesz użyć istniejącego pliku konfiguracyjnego, nie zadziała, ponieważ sekcja najwyższego poziomu jest zaznaczona,
[req]
więc te ustawienia dotyczą tylko polecenia req, a nie polecenia x509. Nie jest konieczne posiadanie znacznika sekcji najwyższego poziomu, więc możesz po prostu usunąć ten pierwszy wiersz, a wtedy będzie on działał poprawnie zarówno w przypadku generowania żądań, jak i certyfikatu.Alternatywnie można użyć
-x509
argumentureq
polecenia, aby wygenerować samopodpisany certyfikat w jednym poleceniu, zamiast najpierw utworzyć żądanie, a następnie certyfikat. W takim przypadku nie jest konieczne usuwanie[req]
wiersza sekcji, ponieważ sekcja ta jest odczytywana i używana przez polecenie req.Podsumowując, oto zmodyfikowany plik konfiguracyjny użyty w powyższych poleceniach:
źródło
Moje rozwiązanie polega na tym, aby zachować
openssl.cnf
taką, jaka jest, i na samym końcu dodać nową sekcję, np.[ cert_www.example.com ]
Gdzie www.example.com jest witryną, dla której chcę utworzyć certyfikat, i w nim wstawić to,subjectAltName
czego potrzebuję (i coś jeszcze). Oczywiście sekcja może mieć dowolną nazwę.Następnie mogę uruchomić
openssl req
polecenie jak poprzednio, dodając tylko,-extensions cert_www.example.com
aby jego zawartość została pobrana, i dodaję,-subj
aby dodać bezpośrednio wszystkie informacje o nazwie DN.Nie zapomnij zweryfikować zawartości certyfikatu po jego utworzeniu i przed użyciem za pomocą
openssl x509 -text
źródło
Skrypt Bash z konfiguracją zapisaną
Jako skrypt powłoki, który powinien działać na różnych platformach z bash. Przyjmuje
HOSTNAME
zestaw env dla powłoki lub podaje wybraną nazwę hosta, npself_signed_cert.sh test
Powyżej mniej więcej wstrzykuje informacje o minimalnym pliku konfiguracyjnym, które potrzebuje openssl.
Uwaga, dołączony dodatkowo
DNS:localhost
jako SAN, aby ułatwić testowanie przez localhost. Usuń ten dodatkowy bit ze skryptu, jeśli go nie chcesz.Kredyt
Odpowiedź bcardarelli jest świetna (nie można komentować / głosować z powodu niewystarczającej liczby powtórzeń). Jednak w odpowiedzi użyto istniejącej lokalizacji pliku konfiguracyjnego openssl, która jest specyficzna dla platformy ... stąd:
Oczywiście trzeba po prostu znaleźć plik konfiguracyjny openssl dla własnej platformy i zastąpić poprawną lokalizację.
Test
Aby przetestować, zaimportuj
test.cert.pem
do uprawnień Chrome wchrome://settings/certificates
:I po testach
źródło