GNU/Linux >> Tutoriels Linux >  >> Linux

Apache – Créer un certificat SSL *.local ?

J'essaie de configurer un seul certificat SSL qui fera fonctionner n'importe quel site Web * .local sur https. Tous les domaines .local pointent vers ma machine locale. Je les utilise lors du développement de sites Web. De nombreuses nouvelles fonctionnalités (géolocalisation, service workers, etc.) nécessitent un SSL.

Je pense que pour les versions récentes de Chrome/Firefox, un certificat auto-signé de la vieille école ne fonctionne plus.

Vous trouverez ci-dessous les étapes que j'ai suivies après avoir suivi une combinaison de ces guides :
https://deliciousbrains.com/https-locally-without-browser-privacy-errors/

https://codeghar.wordpress.com/2008/03/17/create-a-certificate-authority-and-certificates-with-openssl/

https://stackoverflow.com/questions/27294589/creating-self-signed-certificate-for-domain-and-subdomains-neterr-cert-commo

Voici mon fichier de configuration :

#..................................
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/*****/Sites/root-ca
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/certs/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 3000
default_md = sha256
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
copy_extensions = copyall
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = *****
localityName_default = *****
stateOrProvinceName_default = *****
countryName_default = *****
emailAddress_default = *****
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName       = @alternate_names
[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"

[ alternate_names ]

DNS.1       = *.local

Je crée d'abord une nouvelle autorité de certification :

openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 3000 -config conf/caconfig.cnf

J'ai donné le nom commun ici comme mon nom

Common Name (hostname, IP, or your name) []:Jonathan Hodgson

Le fichier certs/cacert.pem J'importe ensuite dans les autorités de chrome qui fonctionnent sans problème.

Je crée alors une demande de certificat :

openssl req -extensions v3_req -new -nodes -out local.req.pem -keyout private/local.key.pem -config conf/caconfig.cnf

J'ai donné le nom commun ici comme *.local

Common Name (hostname, IP, or your name) []:*.local

Je signe alors la demande :

openssl ca -out certs/local.cert.pem  -config conf/caconfig.cnf -infiles local.req.pem

J'ajoute les fichiers à ma configuration http :

<VirtualHost *:80>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
</VirtualHost>

<VirtualHost *:443>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
    SSLEngine On
    SSLCertificateFile /home/jonathan/Sites/root-ca/certs/local.cert.pem
    SSLCertificateKeyFile /home/jonathan/Sites/root-ca/private/local.key.pem
</VirtualHost>

J'ai redémarré apache mais j'obtiens toujours NET::ERR_CERT_COMMON_NAME_INVALID

J'avais l'impression que c'était parce que je devais ajouter le subjectAltName au fichier de configuration que j'ai fait.

Veuillez me faire savoir ce que je devrais faire différemment.

Merci d'avance pour toute aide

Modifier

Je pense que le problème est lié au caractère générique. Si je définis les noms_alternatifs sur example.local et le nom commun de la requête sur example.local, example.local s'affiche comme sécurisé dans Chrome et Firefox.

J'ai essayé de définir DNS.1 sur local et DNS.2 en *.local , je viens alors d'obtenir ERR_SSL_SERVER_CERT_BAD_FORMAT en chrome et SEC_ERROR_REUSED_ISSUER_AND_SERIAL dans firefox. J'ai définitivement réinitialisé mon fichier de série et mon fichier d'index avant de générer les certificats.

Réponse acceptée :

Vous avez ajouté le SAN au CSR mais vous n'avez pas dit ca pour inclure les extensions du CSR dans le certificat. Voir https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificate ou la page de manuel pour ca également sur le Web à copy_extensions

EDIT :Vous aussi besoin de spécifier x509_extensions dans le ca config, ou équivalent mais moins pratique l'option de ligne de commande -extensions , dans les deux cas pointant vers une section qui existe mais qui peut être vide si vous ne voulez pas d'extensions requises par l'autorité de certification. Je n'ai pas remarqué cela au début car je n'avais jamais essayé le cas des extensions de CSR uniquement et non config, ce qui est irréaliste pour la plupart des autorités de certification. Si vous spécifiez copy_extensions autre que none (et le CSR en a) mais ne spécifiez pas x509_extensions puis ca fait mettre les extensions dans le certificat mais ne le fait pas définissez la version du certificat sur v3 comme requis par les normes (comme rfc5280) lorsque des extensions sont présentes.

Connexe :Écran GNU :imprimer une session détachée sur stdout ?

C'est discutable s'il s'agit d'un bogue; la page de manuel indique x509_extensions/extensions contrôle le paramètre v3, et par non dire quelque chose de similaire à propos de copy_extensions implique que non, mais à mon humble avis, c'est certainement une fonctionnalité très sous-optimale. EDIT :il s'agit d'un bogue qui sera corrigé, mais jusque-là, utilisez la solution de contournement, voir https://unix.stackexchange.com/a/394465/59699

CEPENDANT:dans mon test, cela n'a pas réellement résolu votre problème. Même si le certificat a *.local dans SAN et CN et est (maintenant) autrement valide, mon Firefox (53.0.2) et Chrome (59.0.3071.109) le rejettent toujours avec respectivement SSL_ERROR_CERT_DOMAIN_ERROR et ERR_CERT_COMMON_NAME_INVALID. J'ai supposé qu'ils n'excluaient peut-être pas local à partir de la logique normale de niveau 2+ et essayé *.example.local  : Chrome accepte cela, mais pas Firefox. J'ai aussi essayé *.example.org et à la fois Chrome et IE11 aiment ça mais toujours pas Firefox (et bien sûr en vous attribuant des noms dans de vrais TLD comme .org n'est pas la façon dont le DNS est censé fonctionner).

Cela m'a coincé. Avec un peu de travail, OpenSSL peut générer un certificat contenant presque tout ce que vous voulez, mais ce que Firefox et Chrome accepteront Je ne sais pas. Je vais essayer d'examiner cela et de mettre à jour si je trouve quelque chose.

J'espère que vous voulez dire vous avez donné *.local comme CommonName uniquement pour le serveur CSR et NON pour le certificat CA (auto-signé). Si les noms de sujet pour les certificats CA et feuille sont identiques, rien ne fonctionnera de manière fiable. EDIT :votre Q modifié confirme qu'ils étaient correctement différents. Bien qu'il ne mentionne pas également le pays, l'état et l'organisation comme l'exige le ca stratégie que vous avez utilisée.

Remarque "auto-signé" est un terme technique et signifie signé avec la même clé . Votre certificat CA est auto-signé. Votre certificat de serveur est signé par vous-même en utilisant votre propre clé mais ce n'est pas auto-signé. Essayer d'appliquer des instructions pour un certificat auto-signé à un certificat non auto-signé faisait partie de votre problème.

Et le point de Gilles sur md5 pour l'algorithme de signature est également correct.

EDIT :'réinitialiser' le numéro de série (et l'index) pour un openssl ca la configuration est une mauvaise idée, à moins que vous ne supprimiez définitivement le certificat CA et le nom ils servaient à. Les normes indiquent qu'une autorité de certification donnée ne doit pas émettre plus d'un certificat avec la même valeur de série dans le certificat, et le fichier de série est le moyen openssl ca (et aussi x509 -req ) implémente cela. De nos jours, les autorités de certification "réelles" (publiques) n'utilisent plus un simple compteur, mais incluent l'entropie pour bloquer les attaques par collision sur PKI - google hashclash - mais ce n'est pas un problème pour une autorité de certification personnelle comme la vôtre. Je peux facilement croire qu'un navigateur (ou un autre relieur) est mécontent s'il voit plusieurs certificats avec le même nom de série et d'autorité de certification, bien que je ne m'attende PAS à ce qu'un navigateur stocke de manière persistante un certificat feuille - et voit ainsi à la fois l'ancien et le nouveau dans un processus à moins qu'il ne soit long - à moins que vous ne l'importiez dans la boutique applicable, y compris dans Firefox si vous en faites une "exception" permanente.

Connexe :S majuscule dans les autorisations d'un dossier ?
Linux
  1. Curl :(60) Problème de certificat SSL :Impossible d'obtenir le certificat de l'émetteur local ?

  2. Qu'est-ce qu'un certificat SSL ?

  3. Installer un certificat SSL

  4. Acheter ou renouveler un certificat SSL

  5. ‘Types de certificats SSL’

Qu'est-ce qu'un certificat SSL ?

Comment installer un certificat SSL sur CentOS 7

Création d'un certificat SSL auto-signé

Outil de vérification SSL

Comment créer un certificat SSL auto-signé local sur CentOS 8

Comment vérifier la date d'expiration SSL sur Plesk