, , , , , ,

Le certificat SSL émis pour le serveur web est invalide

Dans cet exemple un certificat a été généré pour le serveur web traefik.mairie.local.

L' outil en ligne de commande cURL ne retourne pas d'erreur lors de l'établissement d'une connexion avec le serveur

# Avec cURL, pas de message d'avertissement ou d'erreur
curl --cacert ~/Nextcloud/certs/root_ca_tnf.crt --verbose "https://traefik.mairie.local"

Pourtant lorsqu'on tente d’accéder au site depuis le navigateur Web, un message d'avertissement est affiché Attention : risque probable de sécurité, en affichant les détails on voit apparaitre le code erreur:

Code d’erreur : SSL_ERROR_BAD_CERT_DOMAIN

Si on affiche le certificat émis, on constate qu'il contient bien certains champs de la norme X.509 mais pas le champ SAN (Subject Alternative Name)

openssl x509 -in traefik.mairie.local.cert.pem -noout -text | less

Dans la section x509v3 extensions, le champ X509v3 Subject Alternative Name (SAN) est absent:

. . .
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Server
            Netscape Comment: 
                OpenSSL Generated Server Certificate
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
. . .

Le standard X.509 version 3 est utilisée pour sécuriser les échanges sur le Web. Tous les sites web utilisant SSL/TLS ont un certificat X.509 et l'utilisent pour le chiffrement des échanges.

Des erreurs/avertissements peuvent être remontés par le navigateur si les extensions (ou champs) ne sont pas correctement introduits dans le certificat émis. Certains champs sont obligatoires et leur valeur doit être correctement définie.

Lors de la génération du Certificat, les extensions de la norme X509v3 peuvent être précisées à différentes étapes:

On définit ici un fichier de configuration listant les extensions X509 qui pourront être jointes lors de la création de la CSR ou du certificat (section x509v3_webserver).

server_cert_x509_extensions.cnf
# Fichiers de configuration des demandes de certificats 
# Certificate Signing Request (CSR)
 
[ req ]
# définitions des options pour openssl req
default_bits        = 2048
distinguished_name  = distinguished_name
string_mask         = utf8only
 
# Extensions à ajouter à la requete de certificat
req_extensions = x509v3_webserver
 
# SHA-1 is deprecated, so use SHA-2 instead.
default_md          = sha256
 
 
[ distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = FR
countryName_min                 = 2
countryName_max                 = 2
 
stateOrProvinceName             = State or Province Name
stateOrProvinceName_default     = France
 
localityName                    = Locality Name
localityName_default            = Haute Garonne
 
0.organizationName              = Organization Name
0.organizationName_default      = Mairie de Tournefeuille
 
organizationalUnitName          = Organizational Unit Name
organizationalUnitName_default  = Service informatique
 
emailAddress                    = Email Address
emailAddress_default            = administrateur@mairie-tournefeuille.fr
 
commonName                      = Common Name (user name, hostname or FQDN)
commonName_max                  = 64
 
 
[ x509v3_webserver ]
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
 
[ alt_names ]
#IP.1 = 192.168.33.123
#IP.n = x.x.x.x
DNS.1 = www.example.com
DNS.2 = 4w.example.com
#DNS.n = *.exemple.fr

Depuis le répertoire de l'Autorité de Certification intermédiaire:

# Copier le fichier de configuration par défaut et adapter le contenu au certificat
cp conf/server_cert_x509_extensions.cnf conf/traefik.mairie.local.x509.cnf
 
# Editer conf/traefik.mairie.local.x509.cnf
# La section [ alt_names ] doit contenir le ou les noms de l'hote 

Recréer et vérifier la CSR:

# Commande de création de la CSR
openssl req -new -config conf/traefik.mairie.local.x509.cnf -key private/traefik.mairie.local.key -out csr/traefik.mairie.local.csr.pem

# On affiche la CSR et on vérifie les valeurs présentes après "Requested Extensions"
# notamment la présence du champ "X509v3 Subject Alternative Name"
openssl req -in csr/traefik.mairie.local.csr.pem -noout -text | grep "Requested Extensions" -A12
Les extensions demandés dans la CSR ne seront pas automatiquement intégrées au certificat. Lors de la création du certificat via la commande openssl x509 il faut explicitement désigner les extensions à ajouter via les paramètres -extensions et -extfile
openssl x509 -req -days 30 -in ./csr/traefik.mairie.local.csr.pem -CA ./certs/intermediate_ca_tnf.cert.pem -CAkey ./private/intermediate_ca_tnf.key -CAcreateserial -out ./certs/traefik.mairie.local.cert.pem -extensions x509v3_webserver -extfile conf/traefik.mairie.local.x509.cnf

On peut vérifier que le certificat généré intègre bien les extensions x509v3:

# Affiche le contenu du certificat. Filtre les 12 lignes après la ligne contenant le mot "extensions" 
openssl x509 -in certs/traefik.mairie.local.cert.pem -noout -text | grep extensions -A12

Ci dessous le texte retourné dans la console:

        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Server
            Netscape Comment: 
                OpenSSL Generated Server Certificate
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            X509v3 Subject Alternative Name: 
                DNS:traefik.mairie.local

Cette fois le champ X509v3 Subject Alternative Name est bien présent et contient le nom d’hôte de notre service web.

La copie de ce certificat sur le serveur web produit une connexion valide sans avertissement.

Références