Mémento OpenSSL

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é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:
Catégorie
Tag