Nieprawidłowy certyfikat SSL z podpisem własnym - „Brak alternatywnej nazwy podmiotu”

98

Ostatnio Chrome przestał działać z moimi samopodpisanymi certyfikatami SSL i uważa, że ​​nie są one bezpieczne. Kiedy patrzę na certyfikat w DevTools | Securityzakładce, widzę, że jest napisany

Brak alternatywnej nazwy podmiotu Certyfikat tej witryny nie zawiera rozszerzenia alternatywnej nazwy podmiotu zawierającego nazwę domeny lub adres IP.

Błąd certyfikatu Wystąpiły problemy z łańcuchem certyfikatów witryny (net :: ERR_CERT_COMMON_NAME_INVALID).

Jak mogę to naprawić?

Brad Parks
źródło
33
Jak to nie jest pytanie programistyczne… chodzi o certyfikaty z podpisem własnym, które są częścią tworzenia stosu. ,,, Dziękuję Brad
Sweet Chilly Philly
1
CN=www.example.comjest prawdopodobnie źle. Nazwy hostów zawsze trafiają do sieci SAN . Jeśli jest obecny w CN , to musi być również obecny w SAN (w tym przypadku musisz podać go dwukrotnie). Aby uzyskać więcej zasad i powodów, zobacz Jak podpisujesz żądanie podpisania certyfikatu w urzędzie certyfikacji i Jak utworzyć certyfikat z podpisem własnym za pomocą openssl? Konieczne będzie również umieszczenie certyfikatu z podpisem własnym w odpowiednim magazynie zaufanych certyfikatów.
jww
@jww - to nie jest duplikat tego pytania, ponieważ nie musisz tworzyć certyfikatu za pomocą openssl, możesz go utworzyć za pomocą innych narzędzi.
Brad Parks,
1
@BradParks - Hmmm ... Pytanie zostało oznaczone jako OpenSSL, a zaakceptowana odpowiedź używa OpenSSL. Ponownie otworzyłem i usunąłem tag OpenSSL.
jww

Odpowiedzi:

104

Aby to naprawić, musisz w zasadzie podać dodatkowy parametr opensslpodczas tworzenia certyfikatu

-sha256 -extfile v3.ext

gdzie v3.extjest taki plik, %%DOMAIN%%zastępowany tą samą nazwą, której używasz Common Name. Więcej informacji tutaj i tutaj . Zwróć uwagę, że zazwyczaj ustawisz Common Namei %%DOMAIN%%na domenę, dla której próbujesz wygenerować certyfikat. Więc gdyby tak było www.mysupersite.com, użyłbyś tego do obu.

v3.ext

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

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

Uwaga: skrypty, które rozwiązują ten problem i tworzą w pełni zaufane certyfikaty ssl do użytku w przeglądarce Chrome, Safari i od klientów Java, można znaleźć tutaj

Kolejna uwaga : jeśli wszystko, co próbujesz zrobić, to powstrzymać chrome przed wyrzucaniem błędów podczas przeglądania certyfikatu z podpisem własnym, możesz poinstruować Chrome, aby ignorował wszystkie błędy SSL dla WSZYSTKICH witryn, uruchamiając go specjalną opcją wiersza poleceń, jak opisano tutaj na SuperUser

Brad Parks
źródło
2
Nie jestem pewien, której wersji XAMPP używasz, ale jeśli szukasz linii w tym pliku, która zawiera "openssl x509", powinieneś być w stanie dodać powyższy tekst na końcu tej linii w pliku. Na przykład, ta wersja makecert.bat ma go na linii 9 i będzie w końcu jest: bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. Oczywiście nadal musisz zapisać v3.ext plik do pliku w tym samym folderze.
Brad Parks
1
Po wypróbowaniu wszystkiego zrezygnowałem z Chrome i kontynuowałem z inną przeglądarką. Kilka dni później sprawdziłem dzisiaj z chrome i działa !!! Chrome prawdopodobnie miał błąd i naprawili go. Twoja metoda na brak alternatywnej nazwy podmiotu działa !!!! Po prostu dodaj certyfikat pod zaufanymi certyfikatami głównymi w przeglądarce.
Tarik
35
Dostaję unknown option -extfile. Jak to naprawić?
Nick Manning
2
@NickManning - Może używasz extfiledyrektywy w niewłaściwym poleceniu openssl? Zamiast tego jest używany w openssl req -new ..., jest używany w openssl x509 -req .... Przynajmniej tak ktoś tutaj powiedział , co wydaje się prawdą z przykładu, który mam w innej odpowiedzi na podobne pytanie, jak w pełni wygenerować te certyfikaty
Brad Parks
2
"podaj dodatkowy parametr do openssl" Do którego konkretnie polecenia?
Wymaganych
34

Następujące rozwiązanie zadziałało dla mnie na Chrome 65 ( ref ) -

Utwórz plik konfiguracyjny OpenSSL (przykład: 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

Utwórz certyfikat odwołujący się do tego pliku konfiguracyjnego

openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
 -keyout cert.key -out cert.pem -config req.cnf -sha256
Anshul
źródło
2
To jest świetne! Dokładnie to, czego potrzebowałem, i pomija irytujące podpowiedzi dotyczące takich rzeczy, jak nazwa firmy i stan itp.
coredumperror
2
Wypróbowałem kilka alternatywnych rozwiązań, ale to jedyne, które zadziałało. Dzięki!!
Mirko
1
Możesz przekazać temat z wiersza poleceń: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Jaroslav Záruba
jak zaimportowałeś do chrome? Czy tu nie basicConstraints = CA:truebrakuje?
woodz
19

Bash Script

Stworzyłem skrypt bash, aby ułatwić generowanie samodzielnie podpisanych certyfikatów TLS, które są ważne w Chrome.

Testowane Chrome 65.xi nadal działa. Pamiętaj, aby ponownie uruchomić Chrome po zainstalowaniu nowych certyfikatów.

chrome://restart



Inne zasoby

Kolejnym (znacznie bardziej niezawodnym) narzędziem, które warto sprawdzić, jest cfsslzestaw narzędzi CloudFlare :

Logan
źródło
2
Powinieneś tutaj dodać skrypt i wyjaśnić go.
jww
Wygląda na fajny scenariusz. Ale skrypt nie dostarcza (bezpośrednio) prawdziwej odpowiedzi, na czym polega problem PO. Może wyjaśnij również, na czym polega jego problem.
bshea
4

Po prostu używam -subjparametru dodającego adres IP maszyny. Tak rozwiązany za pomocą tylko jednego polecenia.

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

Możesz dodać inne atrybuty, takie jak C, ST, L, O, OU, emailAddress, aby generować certyfikaty bez pytania.

Ludwig
źródło
3
nie działa dla. wygląda na to, że chrome nie rozpoznaje SAN w ten sposób
mononoke
Mam problemy z wysyłaniem żądania certyfikatu w OpenSSL 1.1.0b przy użyciu tego polecenia.
Rick
Dla mnie (Windows) działała nieco inna składnia: 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 wymaga *.pfxformatu:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
Štěpán Havránek,
3

Miałem tak wiele problemów z uzyskaniem certyfikatów z podpisem własnym działających na macOS / Chrome. W końcu znalazłem Mkcert: „Proste narzędzie o zerowej konfiguracji do tworzenia lokalnie zaufanych certyfikatów programistycznych o dowolnych nazwach”. https://github.com/FiloSottile/mkcert

Anthony
źródło
Działa również na moim systemie Windows 10 w nowej przeglądarce Chrome. Chociaż musiałem skopiować pliki .pem z domyślnego folderu Windows \ system32 do innego, ponieważ Nginx nie może uzyskać dostępu do tego folderu.
vatavale
2
  • Utwórz kopię swojej konfiguracji OpenSSL w swoim katalogu domowym:

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

    lub w systemie Linux:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • Dodaj alternatywną nazwę podmiotu do openssl-temp.cnf, poniżej [v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    Zastąp localhostdomeną, dla której chcesz wygenerować ten certyfikat.

  • Wygeneruj certyfikat:

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

Następnie możesz usunąć openssl-temp.cnf

Vic Seedoubleyew
źródło
1

Udało mi się pozbyć (net :: ERR_CERT_AUTHORITY_INVALID) zmieniając wartość DNS.1 pliku v3.ext

[alt_names] DNS.1 = nazwa_domeny.com

Zmień domainname.com na własną domenę.

Jun See
źródło
1

Oto bardzo prosty sposób na utworzenie certyfikatu IP, któremu będzie ufał Chrome.

Plik 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

Gdzie oczywiście 192.168.1.10 to adres IP sieci lokalnej, któremu chcemy ufać Chrome.

Utwórz certyfikat:

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

W systemie Windows zaimportuj certyfikat do zaufanego głównego magazynu certyfikatów na wszystkich komputerach klienckich. Na telefonie lub tablecie z systemem Android pobierz certyfikat, aby go zainstalować. Teraz Chrome będzie ufać certyfikatowi w systemie Windows i Android.

W programie Windows Dev Box najlepszym miejscem do pobrania openssl.exe jest „c: \ Program Files \ Git \ usr \ bin \ openssl.exe”

AQuirky
źródło
0

na MAC począwszy od wersji chrome 67.0.3396.99 mój certyfikat z podpisem własnym przestał działać.

regeneracja ze wszystkim co tu napisano nie zadziałała.

AKTUALIZACJA

miałam szansę potwierdzić, że moje podejście działa dzisiaj :). Jeśli to nie zadziała, upewnij się, że używasz tego podejścia

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>
$

skopiowane stąd https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

KONIEC AKTUALIZACJI

w końcu był w stanie zobaczyć zielony Secure tylko po usunięciu mojego certyfikatu z systemu i dodaniu go do lokalnego pęku kluczy. (jeśli jest - najpierw go upuść). Nie jestem pewien, czy to ma znaczenie, ale w moim przypadku pobrałem certyfikat przez chrome i zweryfikowałem, że data utworzenia jest dzisiaj - więc to ta, którą właśnie utworzyłem.

mam nadzieję, że będzie to pomocne dla kogoś, kto spędził na nim dzień.

nigdy nie aktualizuj Chrome!

user2932688
źródło
0

Jeśli chcesz uruchomić localhost serwera, musisz skonfigurować CN = localhosti 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
źródło