Autorité de certification et certificats OpenSSL

Création d’une autorité de certification

Cette autorité de certification est la base de la chaine de certification. Il s’agit, ni plus ni moins, que d’un certificat x509 (auto signé) et d’une arborescence de gestion des certificats. Le certificat racine doit être protégé par un mot de passe et disposer d’une durée de validité non nulle.

La procédure de création d’une autorité de certification avec OpenSSL est grandement simplifiée par les scripts perl et bash « CA.XX » fournit dans les pacquages d’OpenSSL. En fonction des distributions, vous les trouverez dans « /usr/lib/ssl/misc/ », dans « /usr/local/ssl/misc/ », dans « /etc/ssl/misc/ », ou dans « /etc/openssl/misc ». Ces scripts font la même choses, ils sont juste scriptés dans un langage différent.

Les paramètres de création de l’autorité de certification sont déclarées dans le script « CA.xx » et dans le fichier de configuration de « openssl.cnf ».

Par défaut, l’arborescence de l’autorité de certification est créée sous « ./demoCA » mais cela peut être changé dans le fichier de configuration et dans le script de création de l’autorité.

mafalda ssl # pwd
/etc/ssl
mafalda ssl # tree
.
|-- misc
|   |-- CA.pl
|   |-- CA.sh
|   |-- c_hash
|   |-- c_info
|   |-- c_issuer
|   `-- c_name
`-- openssl.cnf
 
1 directory, 7 files

Par exemple pour créer une autorité de certification basée sur un certificat ayant une durée de validité de 10 ans dont la racine est « /etc/ssl/CertificateAuthority », modifier les variables  » CADAYS » et « CATOP » dans le fichier du script « CA.pl » ou « CA.sh » ainsi que la valeur de « dir » dans « openssl.cnf » avant de lancer « /chemin/vers/CA.xx -newca » :

mafalda ssl # /etc/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create)
 
Making CA certificate ...
Generating a 1024 bit RSA private key
.............................................++++++
..........................++++++
writing new private key to '/etc/ssl/CertificateAuthority/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:FR
State or Province Name (full name) [Some-State]:Ile-De-France 
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Admin Linux
Organizational Unit Name (eg, section) []:Service Informatique
Common Name (eg, YOUR name) []:FHH
Email Address []:fhh@admin-linux.fr
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/CertificateAuthority/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            fd:e4:e4:40:77:bc:b3:81
        Validity
            Not Before: Oct 13 11:23:24 2009 GMT
            Not After : Oct 11 11:23:24 2019 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Ile-De-France
            organizationName          = Admin Linux
            organizationalUnitName    = Service Informatique
            commonName                = FHH
            emailAddress              = fhh@admin-linux.fr
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                28:DB:B7:CE:1E:F7:3C:CB:63:7F:10:6D:61:A4:4B:16:AB:7A:B1:0D
            X509v3 Authority Key Identifier: 
                keyid:28:DB:B7:CE:1E:F7:3C:CB:63:7F:10:6D:61:A4:4B:16:AB:7A:B1:0D
                DirName:/C=FR/ST=Ile-De-France/O=Admin Linux/OU=Service Informatique/CN=FHH/emailAddress=fhh@admin-linux.fr
                serial:FD:E4:E4:40:77:BC:B3:81
 
            X509v3 Basic Constraints: 
                CA:TRUE
Certificate is to be certified until Oct 11 11:23:24 2019 GMT (3650 days)
 
Write out database with 1 new entries
Data Base Updated

Qui aura pour effet de créer l’arborescence suivante :

mafalda ssl # tree /etc/ssl/CertificateAuthority/
/etc/ssl/CertificateAuthority/
|-- cacert.pem
|-- careq.pem
|-- certs
|-- crl
|-- crlnumber
|-- index.txt
|-- index.txt.attr
|-- index.txt.old
|-- newcerts
|   `-- FDE4E44077BCB381.pem
|-- private
|   `-- cakey.pem
`-- serial
 
4 directories, 9 files

Où :

  • cacert.pem est la clé publique de votre autorité de certification ;
  • private/cakey.pem est la clé privée ;
  • index.txt est le fichier d’index conservant l’association certificat/propriétaire ;
  • index.txt.attr est le fichier d’option des indexes ;
  • serial est le numéro du prochain certificat créé ;
  • certs est le répertoire des certificats signés et de leurs hash associé.

Note sur le répertoire « certs »

Afin de pouvoir vérifier une chaine de certification, on crée dans le répertoire « certs » un lien symbolique pointant vers les certificats signés par la chaine de certification. Ce lien à pour nom « hash.0 » où « hash » est le hachage du « DN » (Dir Name de la forme /C=FR/ST=Ile-De-France/L=Paris/O=Admin Linux/OU=Service Informatique/CN=Marc Dupond/emailAddress=marc.dupond@admin-linux.fr) du certificat.

Le « hash » du certificat est retourné par :

openssl x509 -hash -noout -in certif.{pem,crt}

Dans l’exemple ci dessus nous obtenons :

mafalda CertificateAuthority # openssl x509 -hash -noout -in cacert.pem 
5a558f7f

et créons donc le lien « /etc/ssl/CertificateAuthority/certs/5a558f7f.0 » pointant vers « /etc/ssl/CertificateAuthority/cacert.pem »

Note sur les informations des certificats

ATTENTION : Par défaut, la signature de plusieurs certificats créés avec EXACTEMENT LES MÊMES PARAMÈTRES de sujet (countryName, stateOrProvinceName, organizationName, organizationalUnitName, commonName, emailAddress) n’est pas autorisé !

Pour des certificats machine, il est d’usage que le « commonName » désigne le nom de la machine (souvent dans son entier nom.domaine) tandis que pour les utilisateurs ils désigne leurs « Prénom NOM ».

Si toutefois vous devez impérativement créer deux certificats ayant le même sujet (même DN), passez la valeur « unique_subject » à « no » dans le fichier « index.txt.attr » de votre autorité de certification.

Sans cette modification, vous obtiendrez l’erreur suivante au moment de signer le certificat :

Certificate is to be certified until Oct 21 15:36:37 2010 GMT (365 days)
Sign the certificate? [y/n]:y
 
failed to update database
TXT_DB error number 2

Création d’un certificat

Pour générer une clé SSL utilisable par un service tel qu’Apache ou autre, nous commençons générer la clé privée :

mafalda ~ # openssl genrsa -out admin-linux.key 4096
Generating RSA private key, 4096 bit long modulus
..................... . . . ...........++
..................... . . . .......................++
e is 65537 (0x10001)

Note : l’option « -des3 », « -aes128 », etc, lors de la génération de la clé privée permet de spécifier un mot de passe pour l’utilisation de la clé. Ce mot de passe sera demandé à chaque démarrage du service.

A partir de cette clé, création de la demande de signature qui sera transmise à l’autorité de certification :

mafalda ~ # openssl req -key admin-linux.key -new -out admin-linux.csr -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [Some-State]:Ile-De-France
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Admin Linux
Organizational Unit Name (eg, section) []:Service Informatique
Common Name (eg, YOUR name) []:Marc Dupond
Email Address []:marc.dupond@admin-linux.fr
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
mafalda ~ # ls
admin-linux.csr  admin-linux.key

Enfin, génération du certificat proprement dit :

mafalda ~ # openssl req -x509 -in admin-linux.csr -key admin-linux.key > admin-linux.crt

Les informations du certificat peuvent être lues via la commande suivante :

mafalda ~ # openssl x509 -text -in admin-linux.crt -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            90:78:05:93:8b:ff:ee:b1
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=FR, ST=Ile-De-France, L=Paris, O=Admin Linux, OU=Service Informatique, CN=Marc Dupond/emailAddress=marc.dupond@admin-linux.fr
        Validity
            Not Before: Oct 13 13:56:13 2009 GMT
            Not After : Nov 12 13:56:13 2009 GMT
        Subject: C=FR, ST=Ile-De-France, L=Paris, O=Admin Linux, OU=Service Informatique, CN=Marc Dupond/emailAddress=marc.dupond@admin-linux.fr
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (4096 bit)
                Modulus (4096 bit):
                    00:de:c7:c5:18:d3:1a:6b:9c:8c:bd:35:03:06:da:
...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                5D:C7:AC:25:98:44:58:C9:7B:C4:C2:59:C9:91:72:88:B5:43:DE:98
            X509v3 Authority Key Identifier: 
                keyid:5D:C7:AC:25:98:44:58:C9:7B:C4:C2:59:C9:91:72:88:B5:43:DE:98
                DirName:/C=FR/ST=Ile-De-France/L=Paris/O=Admin Linux/OU=Service Informatique/CN=Marc Dupond/emailAddress=marc.dupond@admin-linux.fr
                serial:90:78:05:93:8B:FF:EE:B1
 
            X509v3 Basic Constraints: 
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
        38:de:ac:1f:7f:f4:e5:d7:e5:f6:54:b3:d6:cd:43:3d:7e:fc:
...

Signature d’un certificat

Récapitulons :

  • dans un premier temps, nous avons créé une autorité de certification ;
  • ensuite, nous avons généré un certificat SSL valide et prêt à être signé.

L’objectif est maintenant de signer le certificat avec l’autorité de certification précédemment créé. Pour cela lancer la commande suivante (en remplaçant par vos paramètres les paramètres de l’exemple) :

mafalda ~ # openssl ca -policy policy_anything -out admin-linux.crt -infiles admin-linux.csr
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/CertificateAuthority/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            fd:e4:e4:40:77:bc:b3:82
        Validity
            Not Before: Oct 13 14:18:41 2009 GMT
            Not After : Oct 13 14:18:41 2010 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Ile-De-France
            localityName              = Paris
            organizationName          = Admin Linux
            organizationalUnitName    = Service Informatique
            commonName                = Marc Dupond
            emailAddress              = marc.dupond@admin-linux.fr
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                Certificate Authority to Admin Linux Fr
            X509v3 Subject Key Identifier: 
                5D:C7:AC:25:98:44:58:C9:7B:C4:C2:59:C9:91:72:88:B5:43:DE:98
            X509v3 Authority Key Identifier: 
                keyid:28:DB:B7:CE:1E:F7:3C:CB:63:7F:10:6D:61:A4:4B:16:AB:7A:B1:0D
 
Certificate is to be certified until Oct 13 14:18:41 2010 GMT (365 days)
Sign the certificate? [y/n]:y
 
 
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Rappel : Comme dit précédement, si vous rencontrez à cette étape une erreur du type :

failed to update database
TXT_DB error number 2

C’est probablement que vous tentez de signer un certificat créé avec le même « Subject » (ou DN) qu’un autre. Voir Note sur les informations des certificats pour plus de détails.

OpenSSL demande le mot de passe de l’autorité de certification puis après vérification affiche le détail du certificat à signer. Le système nous avertis alors que le certificat va être validé pour une durée de 365 jours et demande confirmation. Une fois le certificat signé, il est ajouté à la base des certificats gérés par l’autorité de certification.

En jetant un œil aux fichiers d’index du CA, on peut lire le numéro correspondant aux certificats géré :

mafalda ~ # cat /etc/ssl/CertificateAuthority/index.txt
V       191011112324Z           FDE4E44077BCB381        unknown /C=FR/ST=Ile-De-France/O=Admin Linux/OU=Service Informatique/CN=FHH/emailAddress=fhh@admin-linux.fr
V       101013141841Z           FDE4E44077BCB382        unknown /C=FR/ST=Ile-De-France/L=Paris/O=Admin Linux/OU=Service Informatique/CN=Marc Dupond/emailAddress=marc.dupond@admin-linux.fr

et constater que le certificat que nous venons de signer à bien été ajouté à la liste. De même, le numéro de série du prochain certificat à bien été incrémenté :

mafalda ~ # cat /etc/ssl/CertificateAuthority/serial
FDE4E44077BCB383

Diffuser sa chaine d’authentification

Tous fonctionne pour le moment pour le mieux, mais lors de la connexion à un site utilisant un certificat auto signé ou signé par une autorité de certification non officielle, un avertissement sera affiché à l’utilisateur.

Cela est dû au fait que votre Autorité de Certification n’est pas connue par les navigateurs Web du marché (à moins que vous ne vous appeliez VeriSign ou quelque chose du genre).

Pour résoudre ce problème, vous pouvez diffuser votre chaîne de certification via un site internet. Copiez, ou vous le souhaitez sur votre site web le certificat « cacert.pem » en « cacert.crt ».

Lors d’un clique sur ce fichier, le browser web vous propose immédiatement d’ajouter la chaîne de certification aux autorités reconnues :

Add CA to browser web

Dès que l’autorité de certification est ajoutée, le navigateur internet reconnais le certificat lors de son passage sur vos page. Les détails sur l’autorité de certification sont consultable via la liste des autorité racines comme présenté sur cette capture d’écran réalisée sous firefox 3.X :

CA added to browser

Questions diverses

Comment vérifier la signature d’un certificat ?

Afin de vérifier la validité du certificat, nous faisons appel à l’option « verify » d' »openssl » soit en lui précisant le la clé publique de l’autorité de certification :

mafalda ~ # openssl verify -CAfile /etc/ssl/CertificateAuthority/cacert.pem admin-linux.crt 
admin-linux.crt: OK

ou le répertoire des hash de certificat :

mafalda ~ # openssl verify -CApath /etc/ssl/CertificateAuthority/certs admin-linux.crt 
admin-linux.crt: OK

Comment tester un certificat ?

Vous pouvez tester le certificat depuis généré et signé depuis un navigateur web avec l’option « s_server » d’OpenSSL :

mafalda ~ # cat admin-linux.crt > admin-linux.pem
mafalda ~ # cat admin-linux.key >> admin-linux.pem
mafalda ~ # openssl s_server -cert admin-linux.pem

puis, depuis un navigateur internet, rendez vous sur https://localhost:4433. Vous pouvez alors examiner le certificat qui vous est proposé via votre browser.

Comment s’informer sur un certificat ?

Les différentes informations concernant un certificat peuvent être retrouvées via ses champs x509. Nous retrouvons ainsi :

ses dates de validité :

mafalda ~ # openssl x509 -noout -dates -in admin-linux.pem 
notBefore=Oct 13 14:18:41 2009 GMT
notAfter=Oct 13 14:18:41 2010 GMT

son DN (ou sujet) :

mafalda ~ # openssl x509 -noout -subject -in admin-linux.pem 
subject= /C=FR/ST=Ile-De-France/L=Paris/O=Admin Linux/OU=Service Informatique/CN=Marc Dupond/emailAddress=marc.dupond@admin-linux.fr

l’autorité de certification l’ayant signé :

mafalda ~ # openssl x509 -noout -issuer -in admin-linux.pem 
issuer= /C=FR/ST=Ile-De-France/O=Admin Linux/OU=Service Informatique/CN=FHH/emailAddress=fhh@admin-linux.fr

etc.

Comment télécharger un certificat ?

Un certificat peut être récupéré via l’option « s_client » d’OpenSSL (comme dans cet exemple sur le webmail de Yahoo) :

mafalda ~ # echo | openssl s_client -connect login.yahoo.com:443 2> /dev/null
CONNECTED(00000003)
---
Certificate chain
 0 s:/C=US/ST=California/L=Santa Clara/O=Yahoo! Inc./OU=Yahoo/CN=login.yahoo.com
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIC7TCCAlagAwIBAgIDBaBMMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
...
uwLtIWL7usK66NSPZsGlX635P88imxdXoMooxnYDpMTn
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Santa Clara/O=Yahoo! Inc./OU=Yahoo/CN=login.yahoo.com
issuer=/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
No client certificate CA names sent
---
SSL handshake has read 875 bytes and written 332 bytes
---
New, TLSv1/SSLv3, Cipher is DES-CBC3-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DES-CBC3-SHA
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: BEE4346879BF443A1AEBCD48C96322B188609D96DEBCF08A138D58AD9C56FFB6F78C1A197ACE101CC630B3CF5D27EB89
    Key-Arg   : None
    Start Time: 1255460237
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

ou, juste pour obtenir le certificat :

mafalda ~ # echo | openssl s_client -connect login.yahoo.com:443 2> /dev/null | 
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'  > login.yahoo.com.crt
mafalda ~ # openssl x509 -noout -dates -in login.yahoo.com.crt
notBefore=Jan  4 17:09:06 2006 GMT
notAfter=Jan  4 17:09:06 2011 GMT

5 réflexions au sujet de « Autorité de certification et certificats OpenSSL »

    1. Apparemment ils sont intervenus :

      12:21:11 fhh@mafalda ~ $ echo | openssl s_client -connect login.yahoo.com:443 2> /dev/null | openssl x509 -noout -dates
      notBefore=Dec 21 00:00:00 2010 GMT
      notAfter=Jan 3 23:59:59 2013 GMT

      Celui ci est bon jusqu’en 2013…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *