CentOS7: private PKI : Online Certificate Status Protocol (OCSP)

De Pegasus45

Online Certificate Status Protocol

l'OCSP (Online Certificate Status Protocol) a été créé comme une alternative à la CRL (Certificate Revocation Lists). Comme pour CRL, OCSP permet à un élément (par ex. un navigateur Web) de déterminer l'état de révocation d'un certificat.

Quand une Autorité de Certification signe un certificat, généralement, ils incluent l'adresse d'un serveur OCSP (par ex. http://ocsp.pegasus45.lan) dans le serveur. C'est similaire à la fonction "crlDistributionPoints" utilisée par la CRL.

Pour donner un exemple, quand un navigateur se connecte à un serveur Web et récupère le certificat du serveur, il envoie une requête à l'adresse du serveur OCSP, indiqué dans le certificat Serveur. A cette adresse, un service OCSP est en écoute des requêtes et les répond en indiquant le status de révocation du certificat demandé.

Remarque: Il est recommandé d'utiliser un serveur OCSP le plus tôt possible, dès que vous utilisez des certificats pour les sites Web. Certains navigateurs commencent à déprécier, voir à supprimer, le support des CRL.


Préparation du fichier de configuration

Pour utiliser OCSP, l'Autorité de Certification doit indiquer la localisation du serveur OCSP dans les certificats qu'il signe. Pour cela, utilisez l'option "authorityInfoAccess" dans les sections appropriées, qui dans notre cas, correspond à la section [ server_cert ].

Configuration File
[ server_cert ]
# ... snipped ...
authorityInfoAccess = OCSP;URI:http://ocsp.example.com


Création des certificats pour OCSP

Le service d'écoute d'OCSP requière un certificat afin qu'il puisse signer les réponses avant de les envoyer aux demandeurs. Le certificat pour l'OCSP doit être signé par le même Autorité de Certification qui a signé le certificat en cours de vérification.

On crée la clé privée avec un chiffrage en AES-256:

Command
cd /root/ca/intermediate_ca

openssl genrsa -aes256 \
    -out private/ocsp.pegasus45.lan.key.pem 4096
==========================================================
Generating RSA private key, 4096 bit long modulus
...........................................................................................................................................................++
.............................................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for private/ocsp.pegasus45.lan.key.pem: secret_ocsp_key
Verifying - Enter pass phrase for private/ocsp.pegasus45.lan.key.pem: secret_ocsp_key
==========================================================

On crée maintenant un CSR. Généralement, les détails correspondent à ceux de l'Autorité de Certification. Cependant, le "Common Name" doit être un fqdn.

Command
cd /root/intermediate_ca

openssl req -config openssl.cnf -new -sha256 \
    -key private/ocsp.pegasus45.lan.key.pem \
    -out csr/ocsp.pegasus45.lan.csr.pem
==========================================================
Enter pass phrase for private/ocsp.pegasus45.lan.key.pem: secret_ocsp_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) [FR]:
State or Province Name [Loiret]:
Locality Name [Orleans]:
Organization Name [Pegasus45]:
Organizational Unit Name []:Pegasus45 Certificate Authority
Common Name []:ocsp.pegasus45.lan
Email Address []:
==========================================================

On signe le CSR avec l'Autorité Intermédiaire:

Command
openssl ca -config openssl.cnf \
    -extensions ocsp -days 375 -notext -md sha256 \
    -in csr/ocsp.pegasus45.lan.csr.pem \
    -out certs/ocsp.pegasus45.lan.cert.pem
==========================================================
Using configuration from 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: 4098 (0x1002)
        Validity
            Not Before: Feb 22 16:06:42 2016 GMT
            Not After : Mar  3 16:06:42 2017 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Loiret
            localityName              = Orleans
            organizationName          = Pegasus45
            organizationalUnitName    = Pegasus45 Certificate Authority
            commonName                = ocsp.pegasus45.lan
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Subject Key Identifier: 
                04:E7:20:D2:AC:DE:12:FB:6E:2C:FE:97:8B:92:D4:FF:37:CC:A3:FA
            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
            X509v3 Extended Key Usage: critical
                OCSP Signing
Certificate is to be certified until Mar  3 16:06:42 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
==========================================================

Pour vérifier que le certificat a les bons extensions X509v3.

Command
openssl x509 -noout -text \
    -in certs/ocsp.pegasus45.lan.cert.pem
==========================================================
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage: critical
                OCSP Signing
==========================================================


Révoquer un certificat

L'option "ocsp" d'OpenSSL peut se comporter comme un "responder OCSP", mais c'est un usage pour des tests. Il existe des "responder OCSP" pour la production, mais cela sort du cadre de cette article et fera l'objet d'un autre article.

On va créer un certificat Server pour tester.

Command
cd /root/ca/intermediate_ca

openssl genrsa -out private/test.pegasus45.lan.key.pem 2048
==========================================================
Generating RSA private key, 2048 bit long modulus
.......................................................................................................+++
...........+++
e is 65537 (0x10001)
==========================================================

openssl req -config openssl.cnf \
    -key private/test.pegasus45.lan.key.pem \
    -new -sha256 -out csr/test.pegasus45.lan.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) [FR]:
State or Province Name [Loiret]:
Locality Name [Orleans]:
Organization Name [Pegasus45]:
Organizational Unit Name []:
Common Name []:test.pegasus45.lan
Email Address []:
==========================================================

openssl ca -config openssl.cnf \
    -extensions server_cert -days 375 -notext -md sha256 \
    -in csr/test.pegasus45.lan.csr.pem \
    -out certs/test.pegasus45.lan.cert.pem
==========================================================
Using configuration from 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: 4099 (0x1003)
        Validity
            Not Before: Feb 22 16:15:14 2016 GMT
            Not After : Mar  3 16:15:14 2017 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Loiret
            localityName              = Orleans
            organizationName          = Pegasus45
            commonName                = test.pegasus45.lan
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Server
            Netscape Comment: 
                OpenSSL Generated Server Certificate
            X509v3 Subject Key Identifier: 
                AD:B0:26:F6:DD:A4:12:27:10:9C:F4:BE:2A:D5:1B:3E:D6:7C:0F:C6
            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
                DirName:/C=FR/ST=Loiret/L=Orleans/O=Pegasus45/OU=Pegasus45 Certificate Authority/CN=Pegasus45 Root CA
                serial:10:00

            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
Certificate is to be certified until Mar  3 16:15:14 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
==========================================================

On exécute un "responder OCSP" sur la machine elle-même. Au lieu de stocker le status de révocation dans un fichier CRL séparé, le "responder OCSP" va directement lire le fichier index.txt. La réponse est signée avec la clé de l'OCSP (en utilisant les options -rkey et -rsigner).

Command
openssl ocsp -port 127.0.0.1:2560 -text -sha256 \
    -index index.txt \
    -CA certs/ca-chain.cert.pem \
    -rkey private/ocsp.pegasus45.lan.key.pem \
    -rsigner certs/ocsp.pegasus45.lan.cert.pem \
    -nrequest 1
==========================================================
Enter pass phrase for private/ocsp.pegasus45.lan.key.pem: secret_ocsp_key
Waiting for OCSP client connections...
==========================================================

Depuis un autre terminal, on envoit une requête au "responder OCSP". L'option "-cert" spécifie le certificat qu'on souhaite requêter.

Command
openssl ocsp -CAfile certs/ca-chain.cert.pem \
    -url http://127.0.0.1:2560 -resp_text \
    -issuer certs/intermediate.cert.pem \
    -cert certs/test.pegasus45.lan.cert.pem

Le début de la sortie d'écran indique:

  • qu'une réponse valide a été reçue (OCSP Response Status)
  • l'identité du "responder" (Responder Id)
  • le status de révocation du certificat (Cert Status)
Command
==========================================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Responder Id: C = FR, ST = Loiret, L = Orleans, O = Pegasus45, OU = Pegasus45 Certificate Authority, CN = ocsp.pegasus45.lan
    Produced At: Feb 22 16:24:02 2016 GMT
    Responses:
    Certificate ID:
      Hash Algorithm: sha1
      Issuer Name Hash: 30C399F1A2D04CE6C96DF53EB8E2B16A77F27298
      Issuer Key Hash: BD55CFB718E0DF389E6B3D210FCA2493F50BF5F6
      Serial Number: 1003
    Cert Status: good
    This Update: Feb 22 16:24:02 2016 GMT
==========================================================

On va maintenant révoquer le certificat:

Command
openssl ca -config openssl.cnf \
    -revoke certs/test.pegasus45.lan.cert.pem
==========================================================
Using configuration from openssl.cnf
Enter pass phrase for /root/ca/intermediate/private/intermediate.key.pem: secret_intermediate_ca
Revoking Certificate 1003.
Data Base Updated
==========================================================

Comme précédemment, depuis l'autre terminal, on envoit la même requête. Cette fois-ci, on voit le status révoqué (Cert Status: revoked) et depuis quand il est révoqué (Revocation Time):

Command
==========================================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Responder Id: C = FR, ST = Loiret, L = Orleans, O = Pegasus45, OU = Pegasus45 Certificate Authority, CN = ocsp.pegasus45.lan
    Produced At: Feb 22 16:29:35 2016 GMT
    Responses:
    Certificate ID:
      Hash Algorithm: sha1
      Issuer Name Hash: 30C399F1A2D04CE6C96DF53EB8E2B16A77F27298
      Issuer Key Hash: BD55CFB718E0DF389E6B3D210FCA2493F50BF5F6
      Serial Number: 1003
    Cert Status: revoked
    Revocation Time: Feb 22 16:27:50 2016 GMT
    This Update: Feb 22 16:29:35 2016 GMT
==========================================================


Liste des articles concernés: