CentOS7: private PKI : Liste de révocation des certificats (CRL)

De Pegasus45

Listes de révocation des certificats

Une liste de révocation des certificats (certificate revocation list - CRL) fournit une liste de certificats qui ont été révoqués. Une application cliente (par ex. navigateur Web) peut utiliser une CRL pour vérifier l’authenticité d'un serveur. Un serveur d'application, comme Apache ou OpenVPN, peut utiliser une CRL pour refuser les connexions des clients qui ne sont plus valides.

Vous devez publier la CRL depuis un endroit publique, accessible à tous (par ex. http://pegasus45.lan/intermediate.crl.pem). Tout le monde pourra récupérer cette CRL depuis ce site afin de vérifier si tous les certificats dont ils dépendent ont été révoqués.

Remarque: Certains vendeurs d'applications déprécient de plus en plus les CRL et préfèrent utiliser Online Certificate Status Protocol (OCSP)


Préparation du fichier de configuration

Quand une Autorité de Certification signe un certificat, normalement, il indique la localisation de la CRL dans le certificat. Pour cela, il faut ajouter le paramètre "crlDistributionPoints" dans les sections appropriées. Dans notre cas, il faut l'ajouter dans la section [ server_cert ]:

Configuration File vi /root/ca/intermediate_ca/openssl.cnf
[ server_cert ]
[...]
crlDistributionPoints = URI:http://pegasus45.lan/intermediate.crl.pem


Création de la CRL

Command
cd /root/ca/intermediate_ca

openssl ca -config openssl.cnf \
    -gencrl -out crl/intermediate.crl.pem
===========================================================
Using configuration from openssl.cnf
Enter pass phrase for /root/ca/intermediate_ca/private/intermediate.key.pem: secret_intermediate_ca
===========================================================

Remarque: la section "CRL OPTIONS" du manpage "ca" contient plus d'information sur comment créer les CRL.

Vous pouvez vérifier le contenu de la CRL avec la commande suivante:

Command
openssl crl -in crl/intermediate.crl.pem -noout -text

Comme on n'a pas encore révoqué de certificats, la sortie d'écran indique "No Revoked Certificates".

Vous devrez regénérer régulièrement la CRL. Par défaut, la CRL expire au bout de 30 jours. Ceci est contrôllé par l'option "default_crl_days" de la section [ CA_default ].


Révoquer un certificat

Prenons un exemple. Alice fait tourner un serveur Web Apache et a un répertoire privé contenant des images de chatons. Alice veut autoriser son ami, Bob, à les voir.

Bob crée une clé privée et un CSR (certificate signing request):

Command
cd /home/bob

openssl genrsa -out bob@example.com.key.pem 2048

openssl req -new -key bob@example.com.key.pem \
    -out bob@example.com.csr.pem
==========================================================
Generating RSA private key, 2048 bit long modulus
............................................+++
..+++
e is 65537 (0x10001)
==========================================================

openssl req -new -key bob@example.com.key.pem \
     -out bob@example.com.csr.pem
==========================================================
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]:CA
State or Province Name (full name) []:Quebec
Locality Name (eg, city) [Default City]:Montreal
Organization Name (eg, company) [Default Company Ltd]:Bob ltd
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:bob@example.com
Email Address []:

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

Bob envoie son CSR à Alice, qui alors le dépose dans /root/ca/intermediate_ca/csr/ et le signe.

Command
cd /root/ca/intermediate_ca

openssl ca -config openssl.cnf \
    -extensions usr_cert -notext -md sha256 \
    -in csr/bob@example.com.csr.pem \
    -out certs/bob@example.com.cert.pem
==========================================================
Using configuration from intermediate/openssl.cnf
Enter pass phrase for /root/ca/intermediate/private/intermediate.key.pem: secret_intermediate_ca
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4097 (0x1001)
        Validity
            Not Before: Feb 22 15:13:39 2016 GMT
            Not After : Mar  3 15:13:39 2017 GMT
        Subject:
            countryName               = CA
            stateOrProvinceName       = Quebec
            localityName              = Montreal
            organizationName          = Bob ltd
            commonName                = bob@example.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Client, S/MIME
            Netscape Comment: 
                OpenSSL Generated Client Certificate
            X509v3 Subject Key Identifier: 
                47:9E:11:33:5A:F2:5D:C0:29:C0:60:72:E0:D6:BF:C6:36:D9:BB:05
            X509v3 Authority Key Identifier: 
                keyid:BD:55:CF:B7:18:E0:DF:38:9E:6B:3D:21:0F:CA:24:93:F5:0B:F5:F6

            X509v3 Key Usage: critical
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Client Authentication, E-mail Protection
Certificate is to be certified until Mar  3 15:13:39 2017 GMT (375 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
==========================================================

Alice vérifie que le certificat est bien valide.

Command
openssl verify -CAfile certs/ca-chain.cert.pem \
    certs/bob@example.com.cert.pem
==========================================================
certs/bob@example.com.cert.pem: OK
==========================================================

Le fichier index.txt doit maintenant contenir une nouvelle entrée:

Command
cat index.txt
==========================================================
V       170303133717Z           1000    unknown /C=FR/ST=Loiret/L=Orleans/O=Pegasus45/OU=Pegasus45 Web Services/CN=www.pegasus45.lan
V       170303151339Z           1001    unknown /C=CA/ST=Quebec/L=Montreal/O=Bob ltd/CN=bob@example.com
==========================================================

Alice envoie à Bob le certificat signé. Bob installe le certificat dans son navigateur et peut maintenant accéder au répertoire des chatons d'Alice. Hourra!!! (Bon, ici, je n'ai pas indiqué la configuration nécessaire sur le serveur Apache pour protéger le répertoire des chatons).

Malheureusement, il s’avère que Bob se conduit mal. Bob vient de poster les images d'Alice sur un site Web, affirmant qu'elles lui appartiennent. Alice le découvre et doit révoquer son accès immédiatement.

Command
cd /root/ca/intermediate_ca

openssl ca -config openssl.cnf \
    -revoke certs/bob@example.com.cert.pem
==========================================================
Using configuration from openssl.cnf
Enter pass phrase for /root/ca/intermediate/private/intermediate.key.pem: secret_intermediate_ca
Revoking Certificate 1001.
Data Base Updated
==========================================================

Dans le fichier "index.txt", la ligne correspondant au certificat de Bob commence, maintenant, par la lettre R. Ceci indique que le certificat a été révoqué.

Command
cat index.txt
==========================================================
V       170303133717Z           1000    unknown /C=FR/ST=Loiret/L=Orleans/O=Pegasus45/OU=Pegasus45 Web Services/CN=www.pegasus45.lan
R       170303151339Z   160222152401Z   1001    unknown /C=CA/ST=Quebec/L=Montreal/O=Bob ltd/CN=bob@example.com
==========================================================

Une fois le certificat révoqué, Alice doit regénérer la CRL.

Utilisation de la CRL: côté Serveur

Pour les certificats Client, c'est généralement le serveur (par ex. Apache) qui doit effectuer la vérification de leur validité. Le serveur a besoin de pouvoir accéder localement la CRL.

Dans le cas d'Alice, elle peut ajouter la directive "SSLCARevocationPath" dans sa configuration d'Apache et de copier la CRL sur son serveur Web. La prochaine fois que Bob se connectera au serveur Web, Apache vérifiera son certificat Client dans la CRL et bloquera son accès.

Concernant OpenVPN, on peut utiliser la directive "crl-verify" ce qui permettra à OpenVPN de bloquer les clients qui ont leur certificat révoqué.


Utilisation de la CRL: côté Client

Pour les certificats Serveur, c'est généralement l'application Client (par ex. un navigateur) qui effectuera le contrôle de validité. Cette application devra accéder à distance à la CRL.

Si un certificat a été signé avec une extension qui inclut le paramètre "crlDistributionPoints", l'application pourra lire cette information dans le certificat et récupérer la CRL depuis l'emplacement indiqué.

Les points de distribution de la CRL sont visibles dans les détails du certificat x509v3

Command
openssl x509 -in cute-kitten-pictures.example.com.cert.pem -noout -text
==========================================================
X509v3 CRL Distribution Points:

        Full Name:
          URI:http://pegasus45.lan/intermediate.crl.pem
==========================================================


Liste des articles concernés: