web-dev-qa-db-fra.com

Comment faire en sorte que le navigateur fasse confiance au certificat SSL localhost?

Bien qu'il y ait sontsimilairequestions , et même bonréponses , soit ils ne ne vous préoccupez pas spécifiquement de localhost, ou ne posez pas de question sur une option/solution particulière (auto-signée vs CA).

Quelles sont les options? Comment se comparent-ils? Comment je fais ça?

9
x-yuri

tl; dr Générez un certificat émis par votre propre autorité de certification (voir le script ci-dessous)

Voici ce que j'ai trouvé. Corrigez-moi là où je me trompe.

Il existe des CA (autorités de certification). Ils émettent des certificats (signent les CSR) pour d'autres CA (CA intermédiaires) ou des serveurs (certificats d'entité finale). Certains d'entre eux sont des autorités racines. Ils ont des certificats auto-signés, émis par eux-mêmes. Autrement dit, il existe généralement une chaîne de confiance qui va du certificat de serveur au certificat racine. Et il n'y a personne pour se porter garant d'un certificat racine. En tant que tels, les systèmes d'exploitation ont un magasin de certificats racine (ou magasin de règles de confiance), une liste à l'échelle du système de certificats racine approuvés. Les navigateurs ont leurs propres listes de certificats approuvés, qui se composent d'une liste à l'échelle du système et de certificats approuvés par l'utilisateur.

Dans Chromium, vous gérez les certificats dans chrome: // settings/certificats. Dans Firefox, Preferences > Privacy & Security > Certificates > View Certificates. Les deux ont l'onglet Autorités, qui est une liste de certificats racine approuvés. Et l'onglet Serveurs, une liste de certificats de serveur de confiance.

Pour obtenir un certificat que vous créez CSR (demande de signature de certificat), envoyez-le à CA. CA signe le CSR, le transformant en certificat de confiance dans le processus.

Les certificats et les CSR sont un tas de champs contenant des informations et une clé publique. Certains champs sont appelés extensions. Le certificat CA est un certificat avec basicConstraints = CA:true.

Vous pouvez inspecter les erreurs de certificat dans Chromium dans Developer Tools > Security.

Faire confiance aux certificats dans tout le système

Lorsque vous modifiez le magasin de certificats racine du système d'exploitation, vous devez redémarrer un navigateur. Vous le changez avec:

# trust anchor path/to/cert.crt
# trust anchor --remove path/to/cert.crt

trust place les certificats CA dans la catégorie "autorité" (trust list), ou catégorie "autre entrée" sinon. Les certificats d'autorité de certification apparaissent dans l'onglet Autorités des navigateurs ou dans l'onglet Serveurs.

Firefox ne fait pas confiance aux certificats de serveur du magasin de certificats racine du système d'exploitation, contrairement à Chromium. Les deux font confiance aux certificats d'autorité de certification du magasin de certificats racine du système d'exploitation.

Faire confiance aux certificats dans un navigateur

Dans Chromium et Firefox, vous pouvez ajouter (importer) des certificats à l'onglet Autorités. Si vous essayez d'importer un certificat non-CA, vous obtenez le message "Pas une autorité de certification". Après avoir choisi un fichier, une boîte de dialogue apparaît dans laquelle vous pouvez spécifier les paramètres d'approbation (quand approuver le certificat). Le paramètre pertinent pour faire fonctionner un site est "Faites confiance à ce certificat pour identifier les sites Web".

Dans Chromium, vous pouvez ajouter (importer) des certificats dans l'onglet Serveurs. Mais ils se retrouvent soit sur l'onglet Autorités (certificats CA, et la boîte de dialogue des paramètres de confiance ne s'affiche pas après avoir choisi un fichier), soit sur l'onglet Autres (si le certificat n'est pas CA).

Dans Firefox, vous ne pouvez pas ajouter exactement un certificat à l'onglet Serveurs. Vous ajoutez des exceptions. Et vous pouvez faire confiance à un certificat sans extension (médiocre).

Extensions de certificat auto-signées

Mon système est livré avec les paramètres par défaut suivants (extensions à ajouter) pour les certificats:

basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer

Tiré de / etc/ssl/openssl.cnf , section v3_ca . En savoir plus ici .

De plus, Chromium considère qu'un certificat n'est pas valide lorsqu'il n'a pas subjectAltName = DNS:$domain.

Extensions de certificat non auto-signées

De la section [ usr_cert ] sur /etc/ssl/openssl.cnf :

basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer

Lorsque les navigateurs font confiance à un certificat auto-signé

Pour que Chromium fasse confiance à un certificat auto-signé, il doit avoir basicConstraints = CA:true, et subjectAltName = DNS:$domain. Pour Firefox, cela ne suffit même pas:

basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain

Lorsque les navigateurs approuvent un certificat émis par leur propre autorité de certification

Firefox n'a besoin d'aucune extension, mais Chromium nécessite subjectAltName.

Aide-mémoire de openssl

openssl genpkey -algorithm RSA -out "$domain".key - générer une clé privée ( man )

openssl req -x509 -key "$domain".key -out "$domain".crt - générer un certificat auto-signé ( man )

Sans pour autant -subj il posera des questions concernant le nom distinctif (DN), comme le nom commun (CN), l'organisation (O), la localité (L). Vous pouvez y répondre "à l'avance": -subj "/CN=$domain/O=$org".

Pour ajouter l'extension subjectAltName, vous devez soit avoir une configuration où tout est spécifié, soit ajouter une section à configurer et dire à openssl son ​​nom avec -extensions commutateur:

    -config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
    ) -extensions x509_ext

openssl req -new -key "$domain".key -out "$domain".csr - générer une CSR, cela peut prendre -subj option ( homme )

openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \ -CA ca.crt -CAkey ca.key -CAcreateserial - signe CSR ( homme )

Ne fonctionne pas sans -CAcreateserial. Il crée un ca.srl fichier, où il conserve le numéro de série du dernier certificat généré. Pour ajouter subjectAltName, vous aurez besoin de -extfile commutateur:

    -extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
    )

openssl req -in $domain.csr -text -noout - voir CSR ( man )

openssl x509 -in $domain.crt -text -noout - afficher le certificat ( man )

Générer un certificat auto-signé

(vous aurez besoin d'une exception dans Firefox pour que cela fonctionne)

#!/usr/bin/env bash
set -eu
org=localhost
domain=localhost

Sudo trust anchor --remove "$domain".crt || true

openssl genpkey -algorithm RSA -out "$domain".key
openssl req -x509 -key "$domain".key -out "$domain".crt \
    -subj "/CN=$domain/O=$org" \
    -config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
    ) -extensions x509_ext

Sudo trust anchor "$domain".crt

Générer un certificat émis par sa propre autorité de certification

#!/usr/bin/env bash
set -eu
org=localhost-ca
domain=localhost

Sudo trust anchor --remove ca.crt || true

openssl genpkey -algorithm RSA -out ca.key
openssl req -x509 -key ca.key -out ca.crt \
    -subj "/CN=$org/O=$org"

openssl genpkey -algorithm RSA -out "$domain".key
openssl req -new -key "$domain".key -out "$domain".csr \
    -subj "/CN=$domain/O=$org"

openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
    )

Sudo trust anchor ca.crt

Configuration du serveur Web

Nginx:

server {
    listen  443  ssl;
    ssl_certificate  ssl/localhost.crt;
    ssl_certificate_key  ssl/localhost.key;
    ...

Morbo:

carton exec morbo --listen='https://*:3000?cert=localhost.crt&key=localhost.key' \
    site.pl

P.S. J'utilise Chromium 65.0.3325.162, Firefox 59.0 et openssl-1.1.0.g.

Les fenêtres

Apparemment, Windows n'a pas l'utilitaire trust. Sous Windows, on a deux magasins : magasins de machines locales et de certificats d'utilisateurs actuels. Inutile d'utiliser Local Machine Certificate Store, car nous le faisons fonctionner uniquement pour notre utilisateur actuel. Ensuite, il y a des sous-magasins. Deux d'entre eux prédéfinis étant les plus intéressants: les autorités de certification racines de confiance et les magasins d'autorités de certification intermédiaires. Communément appelé en ligne de commande root et CA .

Vous pouvez accéder au gestionnaire de certificats de Chrome en suivant chrome: // settings /? Search = Gérer% 20certificats, puis en cliquant sur Gérer les certificats. Les onglets Autorités de certification racines de confiance et Autorités de certification intermédiaires sont les plus intéressants.

Une façon de gérer les certificats est via ligne de commande :

>rem list Current User > Trusted Root Certification Authorities store
>certutil.exe -store -user root

>rem list Local Machine > Intermediate Certification Authorities store
>certutil.exe -store -enterprise CA

>rem GUI version of -store command
>certutil.exe -viewstore -user CA

>rem add certificate to Current User > Trusted Root Certification Authorities store
>certutil.exe -addstore -user root path\to\file.crt

>rem delete certificate from Current User > Trusted Root Certification Authorities store by serial number
>certutil.exe -delstore -user root 03259fa1

>rem GUI version of -delstore command
>certutil.exe -viewdelstore -user CA

Les résultats sont les suivants (pour les magasins de machines locales et de certificats d'utilisateurs actuels):

root
    localhost.crt
        error
    ca.crt
        appears in Trusted Root Certification Authorities tab
CA
    localhost.crt
        doesn't work, appears in Other People tab
    ca.crt
        doesn't work, appears in Intermediate Certification Authorities tab

Les autres options consistent à double-cliquer sur un certificat dans l'Explorateur, à importer des certificats à partir du gestionnaire de certificats de Chrome, à l'aide de Certificats MMC Snap-in (run certmgr.msc), ou en utilisant CertMgr.exe .

Pour ceux qui ont installé grep, voici comment vérifier rapidement où se trouve le certificat:

>certutil.exe -store -user root | grep "localhost\|^root\|^CA" ^
& certutil.exe -store -user CA | grep "locahost\|^root\|^CA" ^
& certutil.exe -store -enterprise root | grep "localhost\|^root\|^CA" ^
& certutil.exe -store -enterprise CA | grep "localhost\|^root\|^CA"

Ainsi, l'installation du certificat CA dans le magasin Utilisateur actuel> Autorités de certification racines de confiance semble être la meilleure option. Et assurez-vous de ne pas oublier redémarrez votre navigateur .

Lecture complémentaire

OpenSSL
genpkey
req
x509
Autorité de certification OpenSSL
Certificats pour localhost
iamaCA - Devenez votre propre autorité de certification et délivrez les certifications
Firefox et certificats auto-signés
page d'erreur de contournement du certificat dans Chrome

10
x-yuri