Après avoir pas mal "joué" avec les certificats SSL ces derniers temps, pour des besoins de sécurisation d'accès à un annuaire LDAP entre autre, je me fais un petit mémo des commandes les plus utilisées.
OpenSSL permet de gérer les certificats utilisés dans les connexions SSL (https, ldaps, etc.). Sur les O.S. de type Unix/Linux, il est généralement présent dans les dépôts et s'installe facilement :
yum install openssl
ou encore
apt-get install openssl
On dispose ensuite d'une quarantaine de commandes, qui permettent de gérer des certificats ou des clés.
- Génération d'une clé privée
- Génération d'un certificat auto-signé
- Génération d'une demande de certificat (CSR)
- Signature d'un CSR
- Vérification d'un certificat
- Suppression de la pass-phrase d'une clé
- Conversion en format PKCS12
Générer une clé privée
Génération d'une clé privée, de 2048 bits, avec un algorithme DES3. Avec demande de pass phrase :
openssl genrsa -des3 -out macle.key 2048 Generating RSA private key, 2048 bit long modulus ...........+++ .............+++ e is 65537 (0x10001) Enter pass phrase for macle.key: Verifying - Enter pass phrase for macle.key:
N'oubliez pas de noter la pass phrase, elle sera utilisée par la suite
Génération d'un certificat auto-signé
Génération d'un certificat, auto-signé, avec une durée de 3650 jours (10 ans).
Il faut saisir la pass phrase pour utiliser la clé privée.
openssl req -new -x509 -days 3650 -key macle.key -sha256 -extensions v3_ca -out macle.crt Enter pass phrase for macle.key: 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) [XX]:FR State or Province Name (full name) []:. Locality Name (eg, city) [Default City]:. Organization Name (eg, company) [Default Company Ltd]:My Company Organizational Unit Name (eg, section) []:My Department Common Name (eg, your name or your server's hostname) []:ldap.mycompany.com Email Address []:
Génération d'une demande de certificat (CSR)
Si on ne veut pas générer un certificat auto-signé (pas reconnu dans les navigateurs et clients), il faut généralement passer par une étape intermédiaire : générer un CSR (Certificate Signing Request) qui sera signé par une autorité de certification (les sociétés telles que Verisign, Thwate & Co). On peut aussi utiliser son propre certificat auto-signé comme certificat d'autorité par la suite.
openssl req -sha256 -new -key macle.key -out macle.csr -days 3650 Enter pass phrase for macle.key: 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) [XX]:FR State or Province Name (full name) []:. Locality Name (eg, city) [Default City]:. Organization Name (eg, company) [Default Company Ltd]:My Company Organizational Unit Name (eg, section) []:My Department Common Name (eg, your name or your server's hostname) []:ldap.mycompany.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Les informations à saisir sont globalement les mêmes que pour un certificat auto-signé, avec en option un mot de passe et le nom de la société.
Ce fichier doit être envoyé à l'autorité de certification, qui va le signer et renvoyer un certificat validé.
Le contenu du CSR est bien identifié comme une CERTIFICATE REQUEST:
cat macle.csr -----BEGIN CERTIFICATE REQUEST----- MIICnDCCAYQCAQAwVzELMAkGA1UEBhMCRlIxEzARBgNVBAoMCk15IENvbXBhbnkx FjAUBgNVBAsMDU15IERlcGFydG1lbnQxGzAZBgNVBAMMEmxkYXAubXljb21wYW55 LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKsWwBXdKvgyGyq6 BmlK5ay6RC1PnWjudnlSPDaiNNU3ZUyOVgcOPLxanhG84erI+/g6mui71+6nxtBa ZigsiZBzzoAA790O4Mb5J3BPUd5aHMn79BK74HblgMCUDqVCAwAouMRo1hjZB9Ak xl6dI+bu4WzeNeMrIsaW+aBvqLsW5CaRU8Qq9Jt3/KYm38I5DnkDyKh84wHMC6On xbpyiB8LxophrZEtrKOgV93XW9mHHzcBQgHHQ8L9u72yHo2HX+14ElWg3MZY/53m tlUBavO9s2Y3P8FnHRddbJpwdvPkJy6vlPuZxyPFGpdU1t6dAuKk3/ZffqMyPok1 F0P6cbsCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQBf4yNS8JPp4HtFnECQ032s ZVATdfdVZLY9UUQcYZYFlt9Ja91eskBKa1M5yvj7qJlUkA85bE9c3ZmlrHES7OFC z8c6hi7A2vLBHf9sLHvVbbekDgFobeXeMw/veaByvglIOFN40psNQiztBpcrdEHZ KXhuU0tKZIH/H/GqyfGPx2eLzAxDOQHhxqGq/vddmwNGXaKfEyfVzD/NhTdw6OlH 7B7h1DmhZ8i2jJhPLDsCArbgUQGRtG/Qxt7Sp9E+/JJoNTF9/pK+7zvbcdlfCMJk OHnfpt++Qf03ifuWzUfmQg3yFvUBU7Da6q9AMcfzyvCpfelouNE2arxxHXSZHK4I -----END CERTIFICATE REQUEST-----
Signature d'un CSR
On va signer la demande de certificat (.csr) avec la clé et le certificat de l'autorité de certification :
openssl ca -in macle.csr -out macle.crt -keyfile ca.key -cert ca.crt -days 3650 -extensions usr_cert -notext -md sha256 Using configuration from /etc/pki/tls/openssl.cnf Enter pass phrase for ca.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Nov 24 13:01:30 2014 GMT Not After : Nov 21 13:01:30 2024 GMT Subject: countryName = FR stateOrProvinceName = France organizationName = My Company organizationalUnitName = My Department commonName = ldap.mycompany.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 90:D9:DA:D5:9C:DA:5E:40:F6:2B:16:2B:72:26:5F:AD:0B:20:02:78 X509v3 Authority Key Identifier: keyid:6E:B3:92:ED:A4:04:2C:A1:52:E2:5A:5A:CE:B5:F4:E5:19:ED:C0:E5 Certificate is to be certified until Nov 21 13:01:30 2024 GMT (3650 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
Il est parfois nécessaire de créer un fichier index.txt et serial (selon les O.S.). Par exemple sur un Linux RHEL / CentOS :
touch /etc/pki/CA/index.txt echo 0000 > /etc/pki/CA/serial
Vérification d'un certificat
On peut vérifier le certificat de plusieurs manières :
- avec openssl verify, qui vérifie son DN et sa validité
- avec openssl x509, qui "dump" le contenu du certificat
Par exemple :
openssl verify macle.crt macle.crt: C = FR, O = My Company, OU = My Department, CN = ldap.mycompany.com error 18 at 0 depth lookup:self signed certificate OK
La vérification détermine qu'il s'agit d'un certificat auto-signé.
Dans le cas d'un certificat signé par une autorité de confiance, on aura :
macle.crt: C = FR, ST = France, O = My Company, OU = My Department, CN = ldap.mycompany.com error 20 at 0 depth lookup:unable to get local issuer certificate
on peut ajouter une option pour vérifier le "chaining" avec le certificat de l'autorité :
openssl verify -CAfile ca.crt macle.crt macle.crt: OK
openssl x509 -in macle.crt -noout -text Certificate: Data: Version: 3 (0x2) Serial Number: 0 (0x0) Signature Algorithm: sha256WithRSAEncryption Issuer: C=FR, ST=France, O=My Company, OU=My Department, CN=ROOT CA Validity Not Before: Nov 24 13:01:30 2014 GMT Not After : Nov 21 13:01:30 2024 GMT Subject: C=FR, ST=France, O=My Company, OU=My Department, CN=ldap.mycompany.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:ab:16:c0:15:dd:2a:f8:32:1b:2a:ba:06:69:4a: e5:ac:ba:44:2d:4f:9d:68:ee:76:79:52:3c:36:a2: 34:d5:37:65:4c:8e:56:07:0e:3c:bc:5a:9e:11:bc: e1:ea:c8:fb:f8:3a:9a:e8:bb:d7:ee:a7:c6:d0:5a: .../...
Suppression de la pass-phrase d'une clé
Il peut être utile de supprimer la pass phrase d'une clé privée, notamment si celle-ci doit être utilisée par une application. Ceci se fait via la commande :
cp macle.key macle.key.avecpass openssl rsa -in macle.key.avecpass -out maclesanspass.key Enter pass phrase for macle.key.avecpass: writing RSA key
Conversion en format PKCS12
Le format PKCS12 contient le certificat et la clé ; il est parfois utilisé pour l'import d'un certificat dans des keystore Java ou par des utilitaires Windows.
Il faut disposer de la clé privé et du certificat pour les exporter au format pkcs12 :
openssl pkcs12 -export -inkey macle.key -in $acle.crt -name AliasDeLaCle -out macle.p12
Ceci demande d'entrer la pass phrase de la clé privée, et de saisir un nouveau mot de passe pour le fichier pkcs12.
Par exemple :
openssl pkcs12 -export -inkey macle.key -in macle.crt -name AliasDeLaMaCle -out macle.p12 Enter pass phrase for macle.key: Enter Export Password: Verifying - Enter Export Password: