PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Cyprien Pouzenc : Créer une demande de certification

lundi 31 mars 2014 à 16:02

Demande de certification

Comme nous l'avons vu précédemment, la certification X.509 est un sujet dense. Passons à la pratique.

Logo de OpenSSL
Logo de OpenSSL

Cet article décrit les étapes successives aboutissant à la création d'une demande de certification X.509 (certificate signing request, ou CSR) à soumettre à une autorité de certification. Pour cela, nous utiliserons OpenSSL sur une distribution Debian GNU/Linux. OpenSSL est un logiciel libre très répandu permettant de déployer un grand nombre de fonctionnalités cryptographiques, notamment liées au protocole de sécurisation SSL/TLS.

Informations techniques

Nom du programme : OpenSSL
Version utilisée : 1.0.1e
Licence : BSD
Éditeur : The OpenSSL Project
Site web : www.openssl.org

Distribution utilisée : Debian GNU/Linux 7.4 « Wheezy »

Article Wikipédia : https://fr.wikipedia.org/wiki/OpenSSL
Certification X.509 (article Wikipédia) : https://fr.wikipedia.org/wiki/X509

Création d'une clef privée

Cette étape ne pose aucun problème particulier. Il suffit d'exécuter la commande suivante pour obtenir une clef privée de 2048 bits nommée FQDN.TLD_privatekey.pem :

openssl genrsa -out FQDN.TLD_privatekey.pem 2048

Il est possible d'en limiter les droits d'accès par la commande suivante :

chmod 400 FQDN.TLD_privatekey.pem

La seule vraie difficulté est d'assurer la confidentialité de ce fichier dans le temps.

Générer une demande de certification simple

Là encore, pas de problème particulier. Il suffit d'exécuter la commande suivante pour obtenir la demande de certification nommée FQDN.TLD_csr.pem :

openssl req -new -key FQDN.TLD_privatekey.pem -out FQDN.TLD_csr.pem

Plusieurs informations liées à notre identité sont demandées :

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) [AU]:FR
State or Province Name (full name) [Some-State]:France
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
Organizational Unit Name (eg, section) []:MySection
Common Name (e.g. server FQDN or YOUR name) []:FQDN.TLD
Email Address []:admin@FQDN.TLD

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Il est aussi possible de générer la demande de certificat en une seule commande :

openssl req -new -key FQDN.TLD_privatekey.pem -subj "/C=FR/ST=France/L=Paris/O=MyCompany/OU=MySection/CN=FQDN.TLD/emailAddress=admin@FQDN.TLD" -out FQDN.TLD_csr.pem

Voire même de coupler la création de la clef privée avec la génération de la demande de certificat :

openssl req -new -newkey rsa:2048 -nodes -keyout FQDN.TLD_privatekey.pem -subj "/C=FR/ST=France/L=Paris/O=MyCompany/OU=MySection/CN=FQDN.TLD/emailAddress=admin@FQDN.TLD" -out FQDN.TLD_csr.pem
Demande de certification
Demande de certification

À noter que les informations données pourront être soumises à vérification par l'autorité de certification.

Le champ « Common Name », ou CN, requiert une attention toute particulière. Il s'agit du nom de domaine pour lequel vous souhaitez obtenir le certificat X.509. Ici, FQDN.TLD est donné. Mais cela aurait pu être www.FQDN.TLD, ftp.FQDN.TLD, etc. Le certificat sera valable uniquement pour le domaine donné. Renseigner FQDN.TLD n'implique pas que les sous-domaines soient également concernés. Renseigner *.FQDN.TLD est possible ; il s'agit d'une wildcard qui est valable pour tous les sous-domaines, mais pas pour le domaine racine.

Ceci fait, on peut visualiser la demande avec la commande suivante :

openssl req -text -noout -in FQDN.TLD_csr.pem

Ce qui donne :

Certificate Request:
    Data:
    Version: 0 (0x0)
        Subject: C=FR, ST=France, L=Paris, O=MyCompany, OU=MySection, CN=FQDN.TLD/emailAddress=admin@FQDN.TLD
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:cc:e5:28:c8:7a:ba:46:4d:f3:3b:4c:c9:75:93:
                    5a:37:38:98:3b:57:8b:ea:05:de:a4:c4:03:50:5f:
                    30:53:10:9e:67:3f:63:19:87:68:f0:44:cc:2c:a3:
                    f9:8d:16:d4:36:11:b2:3e:17:c2:68:21:c6:f2:7f:
                    80:60:75:44:96:1d:b9:77:df:6b:a5:a2:02:45:1c:
                    d1:ab:24:3b:6c:fc:c6:ae:4d:a9:c5:12:a4:00:8f:
                    49:a0:0e:cb:25:a1:47:42:4d:ef:41:69:c7:83:34:
                    60:0e:f0:04:9f:b4:88:4e:a9:03:a3:ad:80:f3:2d:
                    c7:a4:04:6d:c1:43:55:ee:1e:94:7c:45:af:16:94:
                    bd:e8:9b:e1:be:76:e3:36:aa:7b:a5:eb:89:2d:09:
                    b2:f9:6d:f2:20:d3:4c:ff:e6:1f:f3:c9:41:d0:77:
                    a2:5b:8a:bf:f0:02:22:70:7e:e8:c4:5e:63:d0:7f:
                    f5:6e:3d:f0:9d:2a:fe:41:95:42:d9:de:ee:0a:ca:
                    7d:1e:75:55:1a:84:77:0c:2a:ec:b2:76:b7:27:98:
                    2d:7e:24:ca:f9:16:c0:76:91:d4:3f:16:21:9b:81:
                    fb:75:f3:a7:4b:04:07:62:72:ba:50:4b:39:3e:ea:
                    43:c8:e9:da:50:db:12:fe:9c:66:f3:aa:9d:36:27:
                    23:2b
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha1WithRSAEncryption
         07:13:6a:e3:40:2b:17:bc:ca:0c:60:da:52:61:f6:93:e3:d5:
         f3:4e:69:7f:cf:ad:62:aa:40:a1:98:c4:d9:f9:ed:6c:06:71:
         f3:b3:36:08:7c:76:97:f2:21:e9:c8:28:58:c9:58:16:61:82:
         84:8e:88:03:05:b0:7c:69:24:1c:9b:9a:ab:8a:c6:d5:ba:52:
         a4:5b:0f:79:48:37:35:a9:25:c6:ad:e3:54:29:b2:93:af:45:
         3b:cd:30:ef:35:9c:8a:58:75:b0:c9:85:90:a2:f2:a8:19:e8:
         b7:b2:15:28:5b:4f:82:32:ae:12:ab:19:95:79:db:04:98:6a:
         c0:3a:39:00:db:97:16:30:09:47:71:04:09:ec:e7:4d:70:26:
         14:fc:1e:57:9a:98:3b:02:3a:99:55:76:27:c7:b5:29:33:47:
         03:b5:ed:60:6f:86:90:11:a3:c2:f9:70:4e:f9:1a:ce:c8:b9:
         41:49:d4:8c:44:04:6e:5d:20:e7:9b:59:a4:b0:d1:91:76:a8:
         7a:ce:0f:f7:e1:63:ab:76:3e:5c:e7:e9:da:2a:ba:3b:df:d7:
         af:85:fb:41:83:4d:f9:fd:e9:72:44:0c:05:18:29:ea:10:92:
         df:b6:56:49:54:c4:4a:43:40:8c:09:c8:b2:6b:bf:56:ed:77:
         8f:87:1f:43

C'est ce fichier FQDN.TLD_csr.pem qu'il faudra transmettre à l'autorité de certification. Parfois, seul son contenu est demandé. On l'obtient avec la commande suivante :

cat FQDN.TLD_csr.pem

Ce qui donne :

-----BEGIN CERTIFICATE REQUEST-----
MIICzjCCAbYCAQAwgYgxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZGcmFuY2UxDjAM
BgNVBAcMBVBhcmlzMRIwEAYDVQQKDAlNeUNvbXBhbnkxEjAQBgNVBAsMCU15U2Vj
dGlvbjERMA8GA1UEAwwIRlFETi5UTEQxHTAbBgkqhkiG9w0BCQEWDmFkbWluQEZR
RE4uVExEMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzOUoyHq6Rk3z
O0zJdZNaNziYO1eL6gXepMQDUF8wUxCeZz9jGYdo8ETMLKP5jRbUNhGyPhfCaCHG
8n+AYHVElh25d99rpaICRRzRqyQ7bPzGrk2pxRKkAI9JoA7LJaFHQk3vQWnHgzRg
DvAEn7SITqkDo62A8y3HpARtwUNV7h6UfEWvFpS96JvhvnbjNqp7peuJLQmy+W3y
INNM/+Yf88lB0HeiW4q/8AIicH7oxF5j0H/1bj3wnSr+QZVC2d7uCsp9HnVVGoR3
DCrssna3J5gtfiTK+RbAdpHUPxYhm4H7dfOnSwQHYnK6UEs5PupDyOnaUNsS/pxm
86qdNicjKwIDAQABoAAwDQYJKoZIhvcNAQEFBQADggEBAAcTauNAKxe8ygxg2lJh
9pPj1fNOaX/PrWKqQKGYxNn57WwGcfOzNgh8dpfyIenIKFjJWBZhgoSOiAMFsHxp
JBybmquKxtW6UqRbD3lINzWpJcat41QpspOvRTvNMO81nIpYdbDJhZCi8qgZ6Ley
FShbT4IyrhKrGZV52wSYasA6OQDblxYwCUdxBAns501wJhT8HleamDsCOplVdifH
tSkzRwO17WBvhpARo8L5cE75Gs7IuUFJ1IxEBG5dIOebWaSw0ZF2qHrOD/fhY6t2
Plzn6doqujvf16+F+0GDTfn96XJEDAUYKeoQkt+2VklUxEpDQIwJyLJrv1btd4+H
H0M=
-----END CERTIFICATE REQUEST-----

Générer une demande de certification multi-domaines

Il est possible d'obtenir un certificat valide pour plusieurs domaines donnés. Toutes les autorités de certification ne le permettent pas forcément, et c'est généralement plus cher. Cela est rendu possible grâce au champ « SubjectAltName ». Pour l'exploiter, il est nécessaire de modifier le fichier de configuration de OpenSSL.

Copier le fichier de configuration dans le répertoire courant :

cp /etc/ssl/openssl.cnf .

Modifier le fichier de configuration :

vim openssl.cnf

Dans la section [req], il faut décommenter la ligne suivante :

# req_extensions = v3_req

Dans la section [v3_req], il faut ajouter les lignes suivantes :

subjectAltName = @alt_names

[alt_names]
DNS.1 = FQDN.TLD
DNS.2 = www.FQDN.TLD
DNS.3 = ftp.FQDN.TLD

Il est possible d'ajouter autant de champs DNS qu'on le souhaite. Pour un certificat valable pour le domaine racine ainsi que tout sous-domaine, deux champs suffisent :

[alt_names]
DNS.1 = FQDN.TLD
DNS.2 = *.FQDN.TLD

Il est aussi possible de renseigner des noms de domaines complètement différents :

[alt_names]
DNS.1 = FQDN.TLD
DNS.2 = www.FQDN2.TLD3
DNS.3 = ftp.FQDN54.TLD18

On peut alors générer la demande de certificat de la même manière que précédemment, à condition de renseigner le fichier de configuration modifié :

openssl req -new -key FQDN.TLD_privatekey.pem -out FQDN.TLD_csr.pem -config openssl.cnf

On obtient ainsi la demande suivante :

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=FR, ST=France, L=Paris, O=MyCompany, OU=MySection, CN=FQDN.TLD/emailAddress=admin@FQDN.TLD
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:cc:e5:28:c8:7a:ba:46:4d:f3:3b:4c:c9:75:93:
                    5a:37:38:98:3b:57:8b:ea:05:de:a4:c4:03:50:5f:
                    30:53:10:9e:67:3f:63:19:87:68:f0:44:cc:2c:a3:
                    f9:8d:16:d4:36:11:b2:3e:17:c2:68:21:c6:f2:7f:
                    80:60:75:44:96:1d:b9:77:df:6b:a5:a2:02:45:1c:
                    d1:ab:24:3b:6c:fc:c6:ae:4d:a9:c5:12:a4:00:8f:
                    49:a0:0e:cb:25:a1:47:42:4d:ef:41:69:c7:83:34:
                    60:0e:f0:04:9f:b4:88:4e:a9:03:a3:ad:80:f3:2d:
                    c7:a4:04:6d:c1:43:55:ee:1e:94:7c:45:af:16:94:
                    bd:e8:9b:e1:be:76:e3:36:aa:7b:a5:eb:89:2d:09:
                    b2:f9:6d:f2:20:d3:4c:ff:e6:1f:f3:c9:41:d0:77:
                    a2:5b:8a:bf:f0:02:22:70:7e:e8:c4:5e:63:d0:7f:
                    f5:6e:3d:f0:9d:2a:fe:41:95:42:d9:de:ee:0a:ca:
                    7d:1e:75:55:1a:84:77:0c:2a:ec:b2:76:b7:27:98:
                    2d:7e:24:ca:f9:16:c0:76:91:d4:3f:16:21:9b:81:
                    fb:75:f3:a7:4b:04:07:62:72:ba:50:4b:39:3e:ea:
                    43:c8:e9:da:50:db:12:fe:9c:66:f3:aa:9d:36:27:
                    23:2b
                Exponent: 65537 (0x10001)
        Attributes:
        Requested Extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:FQDN.TLD, DNS:*.FQDN.TLD
    Signature Algorithm: sha1WithRSAEncryption
         59:3a:65:04:3f:6e:96:a3:86:ef:74:bb:8a:8e:df:ac:22:e7:
         05:8e:3f:cb:97:4e:5c:37:30:c8:65:3d:4c:d0:a7:ed:35:38:
         84:1b:ab:b0:cf:92:89:0b:86:d7:1b:d8:88:40:b2:90:c6:e8:
         ce:45:4d:5c:49:75:24:8b:99:02:6f:aa:16:e4:96:4b:6b:af:
         05:9f:48:05:c4:af:5c:e7:7a:3b:cf:a9:70:d6:98:0e:92:c5:
         dc:38:1b:48:9f:50:60:3f:e5:0c:6c:ac:5e:41:97:67:d3:ba:
         c2:9a:be:a6:fb:b7:ec:1c:df:25:0c:61:3b:66:27:7e:3e:ce:
         af:3a:cd:9c:64:61:c9:25:6a:ac:e4:a6:7d:8a:b9:26:1e:dd:
         a1:32:21:5c:19:e0:e5:5d:2f:6e:2e:b4:17:b1:7b:f9:57:0a:
         f4:0c:18:63:2d:25:a3:0a:db:63:84:1c:f7:2b:2c:6c:c0:56:
         e5:b1:4a:4d:3c:11:69:3c:b3:be:21:e9:a5:e9:93:a0:45:4a:
         91:81:2c:83:48:ee:b7:90:3d:71:0e:0a:4e:a3:ba:5c:0e:ac:
         53:2c:0f:e7:8e:8d:a2:45:ef:f0:54:68:2f:06:67:00:cd:90:
         c9:ce:ad:ac:f7:09:01:ac:72:b7:20:e6:81:24:a5:23:81:76:
         e8:d9:a8:99

Il est nécessaire de renseigner le champ CN ainsi que d'en inclure la valeur dans le SubjectAltName par soucis de compatibilité. En effet, si SubjectAltName est supporté, le champ CN ne sera pas pris en compte. Si SubjectAltName n'est pas supporté, seul le champ CN sera pris en compte.

Générer une demande de certification pour CAcert

CAcert est une autorité de certification communautaire reposant sur une toile de confiance entre les usagers. Il est permis d'utiliser SubjectAltName tel que décrit ci-dessus. Le site propose néanmoins un script shell simplifiant la procédure.

Télécharger le script :

wget svn.cacert.org/CAcert/Software/CSRGenerator/csr -O CSRGenerator.sh

Le rendre exécutable :

chmod +x CSRGenerator.sh

L'exécuter :

./CSRGenerator.sh

Les questions demandées ne devraient pas poser de problème. Il ne faut pas oublier de répéter la valeur entrée au champ CN dans le SubjectAltName.

Attention, le script n'est pas forcément utilisable pour d'autres autorités de certification étant donné qu'il ne demande aucune information relative à l'identité du requérant.

Obtention du certificat d'identité numérique

Une fois la demande soumise, l'autorité de certification délivre le certificat demandé. C'est ce certificat, couplé à la clef privée, qui sera utile à la sécurisation de tout service supportant SSL/TLS. Attention, il est parfois nécessaire de leur adjoindre le certificat racine de l'autorité de certification, ainsi que de toute autorité intermédiaire. La procédure à suivre dépend de l'autorité choisie et du service déployé.

Une fois le certificat correctement installé, il est possible de tester en ligne le domaine concerné grâce à SSL Shopper ou Qualys SSL Labs.

Article sous licence Creative Commons BY-SA 3.0 France.

Gravatar de Cyprien Pouzenc
Original post of Cyprien Pouzenc.Votez pour ce billet sur Planet Libre.