Certificato SSL autofirmato non valido - "Nome alternativo soggetto mancante"


98

Di recente, Chrome ha smesso di funzionare con i miei certificati SSL autofirmati e pensa che non siano sicuri. Quando guardo il certificato nella DevTools | Securityscheda, vedo che dice

Nome alternativo del soggetto mancante Il certificato per questo sito non contiene un'estensione del nome alternativo del soggetto contenente un nome di dominio o un indirizzo IP.

Errore del certificato Ci sono problemi con la catena di certificati del sito (net :: ERR_CERT_COMMON_NAME_INVALID).

Come posso risolvere questo problema?


33
Come è possibile che questa non sia una domanda di programmazione ... riguarda i certificati autofirmati che fanno parte della creazione del tuo Stack. ,,, Grazie Brad
Sweet Chilly Philly

1
CN=www.example.comprobabilmente è sbagliato. I nomi host vanno sempre nella SAN . Se è presente nel CN , allora deve essere presente anche nella SAN (in questo caso devi elencarlo due volte). Per ulteriori regole e motivi, vedere Come si firma la richiesta di firma del certificato con la propria autorità di certificazione e Come creare un certificato autofirmato con openssl? Sarà inoltre necessario posizionare il certificato autofirmato nel truststore appropriato.
jww

@jww - questo non è un duplicato di quella domanda, poiché non è necessario creare un certificato utilizzando openssl, è possibile crearlo con altri strumenti.
Brad Parks,

1
@BradParks - Hmmm ... La domanda è stata contrassegnata con OpenSSL e la risposta accettata utilizza OpenSSL. Ho riaperto e rimosso il tag OpenSSL.
jww

Risposte:


104

Per risolvere questo problema, è necessario fornire un parametro aggiuntivo opensslquando si crea il certificato, in pratica

-sha256 -extfile v3.ext

dove v3.extè un file in questo modo, con %%DOMAIN%%sostituito con lo stesso nome che usi come tuo Common Name. Maggiori informazioni qui e qui . Tieni presente che in genere imposteresti Common Namee %%DOMAIN%%sul dominio per il quale stai tentando di generare un certificato. Quindi, se lo fosse www.mysupersite.com, lo useresti per entrambi.

v3.ext

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

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

Nota: gli script che risolvono questo problema e creano certificati SSL completamente affidabili da utilizzare in Chrome, Safari e dai client Java possono essere trovati qui

Un'altra nota : se tutto ciò che stai cercando di fare è impedire a Chrome di generare errori durante la visualizzazione di un certificato autofirmato, puoi dire a Chrome di ignorare tutti gli errori SSL per TUTTI i siti avviandolo con una speciale opzione della riga di comando, come dettagliato qui su SuperUser


2
Non sei sicuro di quale versione di XAMPP stai usando, ma se cerchi una riga in quel file che contiene "openssl x509", dovresti essere in grado di aggiungere quanto sopra alla fine di quella riga nel file. Ad esempio, questa versione di makecert.bat , ha sulla linea 9, e finirebbe per essere: bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. Ovviamente è ancora necessario salvare il v3.ext file in un file nella stessa cartella.
Brad Parks

1
Ho rinunciato a Chrome dopo aver provato tutto e ho continuato con un altro browser. Pochi giorni dopo, oggi ho controllato con Chrome e funziona !!! Chrome probabilmente aveva un bug e l'hanno risolto. Il tuo metodo per il nome alternativo del soggetto mancante funziona !!!! Basta aggiungere il certificato con certificati radice attendibili nel browser.
Tarik

35
Sto ottenendo unknown option -extfile. Come lo risolvo?
Nick Manning

2
@ NickManning - Forse stai usando la extfiledirettiva nel comando openssl sbagliato? Invece di essere utilizzato in openssl req -new ..., viene utilizzato in openssl x509 -req .... Almeno questo è quello che qualcuno ha detto qui , il che sembra vero dall'esempio che ho in un'altra risposta a una domanda simile su come generare completamente questi certificati
Brad Parks

2
"fornire un parametro extra a openssl" A quale comando in particolare? Sono coinvolti più passaggi e questa risposta è troppo vaga: ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/…
user145400

34

La seguente soluzione ha funzionato per me su Chrome 65 ( rif ) -

Crea un file di configurazione OpenSSL (esempio: 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

Crea il certificato facendo riferimento a questo file di configurazione

openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
 -keyout cert.key -out cert.pem -config req.cnf -sha256

2
È fantastico! Esattamente quello di cui avevo bisogno, e salta anche le fastidiose richieste di cose come il nome della società e lo stato e così via.
coredumperror

2
Ho provato alcune soluzioni alternative là fuori, ma questa è l'unica che ha funzionato per me. Grazie!!
Mirko

1
Puoi passare l'oggetto da una riga di comando: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Jaroslav Záruba

come hai importato in Chrome? Non basicConstraints = CA:truemanca qui ?
woodz

19

Bash Script

Ho creato uno script bash per semplificare la generazione di certificati TLS autofirmati validi in Chrome.

Testato Chrome 65.xe funziona ancora. Assicurati di riavviare Chrome dopo aver installato nuovi certificati.

chrome://restart



Altre risorse

Un altro strumento (molto più robusto) che vale la pena provare è il cfssltoolkit di CloudFlare :


2
Dovresti aggiungere lo script qui e spiegarlo.
jww

Sembra una bella sceneggiatura. Ma uno script non fornisce (direttamente) una risposta reale su quale sia il problema dell'OP. Forse spiega anche qual è il suo problema.
bshea

4

Uso semplicemente il -subjparametro aggiungendo l'indirizzo IP della macchina. Quindi risolto con un solo comando.

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

Puoi aggiungere altri attributi come C, ST, L, O, OU, emailAddress per generare certificati senza che ti venga richiesto.


3
non funziona per. sembra che chrome non riconosca SAN in questo modo
mononoke

Ho "problemi con la richiesta di certificato" su OpenSSL 1.1.0b usando questo comando.
Rick

Per me (Windows) ha funzionato una sintassi leggermente diversa: 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 quindi ha bisogno del *.pfxformato:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
Štěpán Havránek

3

Ho avuto così tanti problemi nel far funzionare i certificati autofirmati su macos / Chrome. Alla fine ho trovato Mkcert, "Un semplice strumento di configurazione zero per creare certificati di sviluppo affidabili a livello locale con qualsiasi nome desideri". https://github.com/FiloSottile/mkcert


Funziona anche sul mio Windows 10 nel nuovo Chrome. Anche se ho dovuto copiare i file .pem dalla cartella Windows \ system32 predefinita a un'altra, perché Nginx non può accedere a questa cartella.
vatavale

2
  • Crea una copia della tua configurazione OpenSSL nella tua home directory:

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

    o su Linux:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • Aggiungi il nome alternativo del soggetto a openssl-temp.cnf, sotto [v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    Sostituisci localhostcon il dominio per il quale desideri generare il certificato.

  • Genera certificato:

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

È quindi possibile eliminare openssl-temp.cnf


1

Sono stato in grado di sbarazzarmi di (net :: ERR_CERT_AUTHORITY_INVALID) modificando il valore DNS.1 del file v3.ext

[alt_names] DNS.1 = nomedominio.com

Cambia nomedominio.com con il tuo dominio.


1

Ecco un modo molto semplice per creare un certificato IP di cui Chrome si fiderà.

Il file 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

Dove, ovviamente 192.168.1.10 è l'IP della rete locale di cui vogliamo che Chrome si fidi.

Crea il certificato:

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

In Windows importare il certificato nell'archivio certificati radice attendibili su tutti i computer client. Su telefono o tablet Android scarica il certificato per installarlo. Ora Chrome si fiderà del certificato su Windows e Android.

Su Windows Dev Box il posto migliore per ottenere openssl.exe è "c: \ Program Files \ Git \ usr \ bin \ openssl.exe"


0

su MAC a partire dalla versione di chrome 67.0.3396.99 il mio certificato autofirmato ha smesso di funzionare.

rigenerazione con tutto quello che scritto qui non ha funzionato.

AGGIORNARE

ho avuto la possibilità di confermare che il mio approccio funziona oggi :). Se non funziona, assicurati di utilizzare questo approccio

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

copiato da qui https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

FINE AGGIORNAMENTO

finalmente è stato possibile vedere Secure verde solo quando ho rimosso il mio certificato dal sistema e l' ho aggiunto al portachiavi locale . (se ce n'è uno, rilascialo prima). Non sono sicuro che sia importante, ma nel mio caso ho scaricato il certificato tramite Chrome e ho verificato che la data di creazione sia oggi, quindi è quella che ho appena creato.

spero che sia utile per qualcuno che ci trascorre una giornata.

non aggiornare mai Chrome!


0

Se vuoi eseguire il tuo server localhost, devi configurare CN = localhoste 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
emailAddress=contact@example.com
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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.