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?
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
.
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.
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).
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
.
De la section [ usr_cert ]
sur /etc/ssl/openssl.cnf
:
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
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
Firefox n'a besoin d'aucune extension, mais Chromium nécessite subjectAltName
.
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 )
(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
#!/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
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
.
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 .
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