Certificat SSL auto-signé non valide - "Autre nom du sujet manquant"

96

Récemment, Chrome a cessé de fonctionner avec mes certificats SSL auto-signés et pense qu'ils ne sont pas sécurisés. Quand je regarde le certificat dans l' DevTools | Securityonglet, je peux voir qu'il dit

Autre nom de sujet manquant Le certificat de ce site ne contient pas d'extension de nom alternatif de sujet contenant un nom de domaine ou une adresse IP.

Erreur de certificat Il y a des problèmes avec la chaîne de certificats du site (net :: ERR_CERT_COMMON_NAME_INVALID).

Comment puis-je réparer cela?

Brad Parks
la source
33
Comment n'est-ce pas une question de programmation ..... il s'agit de certificats d'auto-signature qui font partie de la création de votre pile. ,,, Merci Brad
Sweet Chilly Philly
1
CN=www.example.comest probablement faux. Les noms d'hôte vont toujours dans le SAN . S'il est présent dans le CN , il doit l'être également dans le SAN (vous devez le lister deux fois dans ce cas). Pour plus de règles et de raisons, consultez Comment signer une demande de signature de certificat avec votre autorité de certification et Comment créer un certificat auto-signé avec openssl? Vous devrez également placer le certificat auto-signé dans le magasin de confiance approprié.
jww
@jww - ce n'est pas une copie de cette question, car vous n'avez pas besoin de créer un certificat en utilisant openssl, vous pouvez le créer avec d'autres outils.
Brad Parks
1
@BradParks - Hmmm ... La question a été étiquetée OpenSSL et la réponse acceptée utilise OpenSSL. J'ai rouvert et supprimé la balise OpenSSL.
jww

Réponses:

104

Pour résoudre ce problème, vous devez fournir un paramètre supplémentaire openssllorsque vous créez le certificat, en gros

-sha256 -extfile v3.ext

v3.extest un fichier comme celui-ci, %%DOMAIN%%remplacé par le même nom que celui que vous utilisez Common Name. Plus d'informations ici et ici . Notez que généralement, vous définissez le Common Nameet %%DOMAIN%%sur le domaine pour lequel vous essayez de générer un certificat. Donc, si c'était le cas www.mysupersite.com, vous l'utiliseriez pour les deux.

v3.ext

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

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

Remarque: Les scripts qui résolvent ce problème et créent des certificats SSL entièrement fiables à utiliser dans Chrome, Safari et à partir de clients Java sont disponibles ici

Une autre note : Si tout ce que vous essayez de faire est d'empêcher Chrome de générer des erreurs lors de l'affichage d'un certificat auto-signé, vous pouvez dire à Chrome d'ignorer toutes les erreurs SSL pour TOUS les sites en le démarrant avec une option de ligne de commande spéciale, comme détaillé ici sur SuperUser

Brad Parks
la source
2
Vous ne savez pas quelle version de XAMPP vous utilisez, mais si vous recherchez une ligne dans ce fichier qui contient «openssl x509», vous devriez pouvoir ajouter ce qui précède à la fin de cette ligne dans le fichier. Par exemple, cette version de makecert.bat , a sur la ligne 9, et finirait par être: bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. Bien sûr, vous devez toujours enregistrer le v3.ext dans un fichier dans le même dossier.
Brad Parks
1
J'ai abandonné Chrome après avoir tout essayé et j'ai continué avec un autre navigateur. Quelques jours plus tard, aujourd'hui j'ai vérifié avec chrome et ça marche !!! Chrome avait probablement un bogue et ils l'ont corrigé. Votre méthode pour le nom alternatif du sujet fonctionne !!!! Ajoutez simplement le certificat sous les certificats racine de confiance dans le navigateur.
Tarik
35
Je reçois unknown option -extfile. Comment puis-je réparer ça?
Nick Manning
2
@NickManning - Vous utilisez peut-être la extfiledirective dans la mauvaise commande openssl? Au lieu d'être utilisé dans openssl req -new ..., il est utilisé dans openssl x509 -req .... Du moins, c'est ce que quelqu'un a dit ici , ce qui semble vrai d'après l'exemple que j'ai dans une autre réponse à une question similaire sur la façon de générer pleinement ces certificats
Brad Parks
2
"fournir un paramètre supplémentaire à openssl" À quelle commande spécifiquement? Plusieurs étapes sont impliquées et cette réponse est trop vague: ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0
...
34

La solution suivante a fonctionné pour moi sur Chrome 65 ( ref ) -

Créez un fichier de configuration OpenSSL (exemple: 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

Créez le certificat référençant ce fichier de configuration

openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
 -keyout cert.key -out cert.pem -config req.cnf -sha256
Anshul
la source
2
C'est bien! Exactement ce dont j'avais besoin, et cela évite les invites ennuyeuses pour des éléments tels que le nom et l'état de l'entreprise, etc.
coredumperror
2
J'ai essayé des solutions alternatives mais c'est la seule qui a fonctionné pour moi. THX!!
Mirko
1
Vous pouvez passer le sujet à partir d'une ligne de commande: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Jaroslav Záruba
comment avez-vous importé dans chrome? N'est-ce pas ici basicConstraints = CA:truemanquant?
woodz
19

Script bash

J'ai créé un script bash pour faciliter la génération de certificats TLS auto-signés valides dans Chrome.

Testé Chrome 65.xet il fonctionne toujours. Assurez-vous de redémarrer Chrome après avoir installé de nouveaux certificats.

chrome://restart



Autres ressources

Un autre outil (beaucoup plus robuste) qui mérite d'être vérifié est la cfsslboîte à outils de CloudFlare :

Logan
la source
2
Vous devez ajouter le script ici et l'expliquer.
jww
Cela ressemble à un joli script. Mais un script ne fournit pas (directement) une vraie réponse quant à ce qu'est le problème du PO. Peut-être aussi expliquer quel est son problème.
bshea le
4

J'utilise simplement le -subjparamètre ajoutant l'adresse IP des machines. Donc résolu avec une seule commande.

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

Vous pouvez ajouter d'autres attributs tels que C, ST, L, O, OU, emailAddress pour générer des certificats sans y être invité.

Ludwig
la source
2
ne fonctionne pas pour. il semble que chrome ne reconnaisse pas SAN de cette façon
mononoke
J'ai eu des "problèmes de demande de certificat" sur OpenSSL 1.1.0b en utilisant cette commande.
Rick
Pour moi (Windows) a travaillé une syntaxe légèrement différente: 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 a alors besoin d'un *.pfxformat:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
Štěpán Havránek
3

J'ai eu tellement de problèmes pour obtenir des certificats auto-signés fonctionnant sur macos / Chrome. Enfin, j'ai trouvé Mkcert, "Un simple outil de configuration zéro pour créer des certificats de développement de confiance localement avec tous les noms que vous souhaitez." https://github.com/FiloSottile/mkcert

Anthony
la source
Cela fonctionne également sur mon Windows 10 dans le nouveau Chrome. Bien que j'ai dû copier les fichiers .pem du dossier Windows \ system32 par défaut vers un autre, car Nginx ne peut pas accéder à ce dossier.
vatavale
2
  • Faites une copie de votre configuration OpenSSL dans votre répertoire personnel:

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

    ou sous Linux:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • Ajouter un autre nom de sujet à openssl-temp.cnf, sous [v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    Remplacez localhostpar le domaine pour lequel vous souhaitez générer ce certificat.

  • Générer un certificat:

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

Vous pouvez ensuite supprimer openssl-temp.cnf

Vic Seedoubleyew
la source
1

J'ai pu me débarrasser de (net :: ERR_CERT_AUTHORITY_INVALID) en modifiant la valeur DNS.1 du fichier v3.ext

[alt_names] DNS.1 = domainname.com

Changez domainname.com avec votre propre domaine.

Jun Voir
la source
1

Voici un moyen très simple de créer un certificat IP auquel Chrome fera confiance.

Le fichier 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

Où, bien sûr, 192.168.1.10 est l'adresse IP du réseau local à laquelle nous voulons que Chrome fasse confiance.

Créez le certificat:

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

Sous Windows, importez le certificat dans le magasin de certificats racine de confiance sur toutes les machines clientes. Sur un téléphone ou une tablette Android, téléchargez le certificat pour l'installer. Maintenant, Chrome fera confiance au certificat sur Windows et Android.

Sur Windows dev box, le meilleur endroit pour obtenir openssl.exe est de "c: \ Program Files \ Git \ usr \ bin \ openssl.exe"

AQuirky
la source
0

sur MAC à partir de la version 67.0.3396.99 de chrome, mon certificat auto-signé a cessé de fonctionner.

la régénération avec tout ce qui est écrit ici n'a pas fonctionné.

METTRE À JOUR

eu la chance de confirmer que mon approche fonctionne aujourd'hui :). Si cela ne fonctionne pas pour vous, assurez-vous que vous utilisez cette approche

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

copié à partir d'ici https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

FIN DE LA MISE À JOUR

a finalement pu voir Green Secure uniquement lorsque j'ai supprimé mon certificat du système , et ajouté au trousseau local . (s'il y en a un - déposez-le d'abord). Je ne sais pas si cela compte, mais dans mon cas, j'ai téléchargé le certificat via Chrome et vérifié que la date de création est aujourd'hui - c'est donc celle que je viens de créer.

J'espère que cela sera utile pour quelqu'un qui y passe une journée.

ne mettez jamais à jour chrome!

user2932688
la source
0

Si vous souhaitez exécuter votre serveur localhost, vous devez configurer CN = localhostet 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
la source