CentOS7: private PKI : Création de l'Autorité Intermédiaire

De Pegasus45

Création de l'Autorité Intermédiaire

Une Autorité Intermédiaire (Intermediate CA) est une entité qui peut signer des certificats de la part de l'Autorité Racine (Root CA). L'Autorité Racine signe le certificat de l'Autorité Intermédiaire, ce qui forme une chaine de certification.

L'intérêt d'utiliser une Autorité Intermédiaire est principalement sécuritaire. La clé privée de l'Autorité Racine doit être gardée en lieu sûr, déconnectée du réseau et de l'utiliser le moins possible. Si la clé de l'Autorité Intermédiaire est compromise, l'Autorité Racine peut la révoquer et en créer une nouvelle.


Préparation des répertoires

Dans cette exemple, au lieu d'utiliser 2 serveurs comme cela a été recommandé précédemment, on ne va en utiliser qu'un seul. Les fichiers de l'Autorité Racine sont gardés dans /root/ca/root_ca. On utilisera un autre répertoire pour les fichiers de l'Autorité Intermédiaire (/root/ca/intermediate_ca)

Command
mkdir -p /root/ca/intermediate_ca

On crée la même arborescence que celle de l'Autorité Racine. Il faut, en plus, créer un répertoire "csr" pour y stocker les demandes de signature.

Command
cd /root/ca/intermediate_ca
mkdir certs crl csr newcerts private
chmod 700 private
touch index.txt
echo 1000 > serial

On ajoute un fichier crlnumber, qui sera utilisé pour tracer les fichiers de révocation.

Command
echo 1000 > /root/ca/intermediate_ca/crlnumber

On crée un fichier de configuration pour OpenSSL. 5 options ont été modifiées par rapport au fichier de configuration de l'Autorité Racine (Root CA):

Configuration File
[ CA_default ]
dir             = /root/ca/intermediate_ca
private_key     = $dir/private/intermediate.key.pem
certificate     = $dir/certs/intermediate.cert.pem
crl             = $dir/crl/intermediate.crl.pem
policy          = policy_loose

On crée donc ce fichier:

Configuration File vi /root/ca/intermediate_ca/openssl.cnf
# OpenSSL intermediate CA configuration file.
# Copy to `/root/ca/intermediate_ca/openssl.cnf`.

[ ca ]
# `man ca`
default_ca = CA_default

[ CA_default ]
# Directory and file locations.
dir               = /root/ca/intermediate_ca
certs             = $dir/certs
crl_dir           = $dir/crl
new_certs_dir     = $dir/newcerts
database          = $dir/index.txt
serial            = $dir/serial
RANDFILE          = $dir/private/.rand

# The root key and root certificate.
private_key       = $dir/private/intermediate.key.pem
certificate       = $dir/certs/intermediate.cert.pem

# For certificate revocation lists.
crlnumber         = $dir/crlnumber
crl               = $dir/crl/intermediate.crl.pem
crl_extensions    = crl_ext
default_crl_days  = 30

# SHA-1 is deprecated, so use SHA-2 instead.
default_md        = sha256

name_opt          = ca_default
cert_opt          = ca_default
default_days      = 375
preserve          = no
policy            = policy_loose

[ policy_strict ]
# The root CA should only sign intermediate certificates that match.
# See the POLICY FORMAT section of `man ca`.
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ policy_loose ]
# Allow the intermediate CA to sign a more diverse range of certificates.
# See the POLICY FORMAT section of the `ca` man page.
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req ]
# Options for the `req` tool (`man req`).
default_bits        = 2048
distinguished_name  = req_distinguished_name
string_mask         = utf8only

# SHA-1 is deprecated, so use SHA-2 instead.
default_md          = sha256

# Extension to add when the -x509 option is used.
x509_extensions     = v3_ca

[ req_distinguished_name ]
# See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
countryName                     = Country Name (2 letter code)
stateOrProvinceName             = State or Province Name
localityName                    = Locality Name
0.organizationName              = Organization Name
organizationalUnitName          = Organizational Unit Name
commonName                      = Common Name
emailAddress                    = Email Address

# Optionally, specify some defaults.
countryName_default             = FR
stateOrProvinceName_default     = Loiret
localityName_default            = Orleans
0.organizationName_default      = Pegasus45
organizationalUnitName_default  =
emailAddress_default            =

[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

[ usr_cert ]
# Extensions for client certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = client, email
nsComment = "OpenSSL Generated Client Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection

[ server_cert ]
# Extensions for server certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[ crl_ext ]
# Extension for CRLs (`man x509v3_config`).
authorityKeyIdentifier=keyid:always

[ ocsp ]
# Extension for OCSP signing certificates (`man ocsp`).
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning


Création de la clé privée

On crée la clé privée de l'Autorité Intermédiaire (intermediate.key.pem) et on la chiffre avec l'algorithme AES-256 et un mot de passe fort.

Command
cd /root/ca/intermediate_ca

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

chmod 400 private/intermediate.key.pem


Création du certificat

On utilise cette clé privée pour créer une demande de signature de certificat (certificate signing request - CSR). Généralement, les paramètres devraient correspondre à ceux de l'Autorité Racine. Par contre, le "Common Name" doit être différent.

Remarque: faites bien attention à spécifier le fichier de configuration de l'Autorité Intermédiaire (intermediate/openssl.cnf)

Command
cd /root/ca/intermediate_ca

openssl req -config openssl.cnf -new -sha256 \
    -key private/intermediate.key.pem \
    -out csr/intermediate.csr.pem
===============================================================
Enter pass phrase for intermediate/private/intermediate.key.pem: secret_intermediate_ca
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 []:Pegasus45 Intermediate CA
Email Address []:
===============================================================

Pour créer un certificat pour l'Autorité Intermédiaire, on utilise l'Autorité Racine avec l'extension "v3_intermediate_ca" pour signer le CSR de l'Intermédiaire. Le certificat de l'Autorité Intermédiaire doit être valide pour une durée plus petite que celle de l'Autorité Racine. 10 ans reste raisonnable.

Remarque: cette fois-ci, on spécifie le fichier de configuration de "Root CA" (/root/ca/openssl.cnf)

Command
cd /root/ca/root_ca

openssl ca -config openssl.cnf -extensions v3_intermediate_ca \
    -days 3650 -notext -md sha256 \
    -in /root/ca/intermediate_ca/csr/intermediate.csr.pem \
    -out /root/ca/intermediate_ca/certs/intermediate.cert.pem
===============================================================
Using configuration from openssl.cnf
Enter pass phrase for /root/ca/root_ca/private/ca.key.pem: secret_root_ca
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4096 (0x1000)
        Validity
            Not Before: Feb 22 11:03:07 2016 GMT
            Not After : Feb 19 11:03:07 2026 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Loiret
            organizationName          = Pegasus45
            organizationalUnitName    = Pegasus45 Certificate Authority
            commonName                = Pegasus45 Intermediate CA
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                BD:55:CF:B7:18:E0:DF:38:9E:6B:3D:21:0F:CA:24:93:F5:0B:F5:F6
            X509v3 Authority Key Identifier: 
                keyid:24:82:CC:80:21:C5:30:14:36:87:A2:B9:10:EE:69:E6:BB:A8:C1:17

            X509v3 Basic Constraints: critical
                CA:TRUE, pathlen:0
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
Certificate is to be certified until Feb 19 11:03:07 2026 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
===============================================================

chmod 444 /root/ca/intermediate_ca/certs/intermediate.cert.pem

Le fichier index.txt est utilisé par l'option "ca" d'OpenSSL pour stocker la base des certificats. Vous ne devez jamais supprimer et modifier ce fichier à la main. Il doit maintenant contenir une ligne correspondant au certificat de l'Autorité Intermédiaire:

Command
cat index.txt
===============================================================
V       260219110307Z           1000    unknown /C=FR/ST=Loiret/O=Pegasus45/OU=Pegasus45 Certificate Authority/CN=Pegasus45 Intermediate CA
===============================================================


Vérification du certificat

Comme pour l'Autorité Racine, on doit vérifier que les détails du certificat de l'Autorité Intermédiaire sont corrects.

Command
openssl x509 -noout -text \
    -in /root/ca/intermediate_ca/certs/intermediate.cert.pem
===============================================================
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 4096 (0x1000)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=FR, ST=Loiret, L=Orleans, O=Pegasus45, OU=Pegasus45 Certificate Authority, CN=Pegasus45 Root CA
        Validity
            Not Before: Feb 22 11:03:07 2016 GMT
            Not After : Feb 19 11:03:07 2026 GMT
        Subject: C=FR, ST=Loiret, O=Pegasus45, OU=Pegasus45 Certificate Authority, CN=Pegasus45 Intermediate CA
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
===============================================================

Vérifiez la validité de ce certificat auprès de l'Autorité Racine. Un "OK" indique que la chaine de certification est intacte.

Command
openssl verify -CAfile certs/ca.cert.pem \
    /root/ca/intermediate_ca/certs/intermediate.cert.pem
===============================================================
/root/ca/intermediate_ca/certs/intermediate.cert.pem: OK
===============================================================


Créer le fichier de la chaine de certification

Quand une application (par ex. un navigateur) essaies de vérifier la validité d'un certificat qui a été signé par une Autorité Intermédiaire, il doit également vérifier la validité du certificat de l'Autorité Intermédiaire auprès de l'Autorité Racine. Pour valider la chaine de certification, on doit créer une chaine de certification des Autorité de Certification qu'on doit présenter à l'application.

Pour créer cette chaine de certification, on doit concaténer l'ensemble des certificats de l'Autorité Racine et de l'Autorité Intermédiaire. On utilisera ce fichier plus tard pour vérifier les certificats signés par l'Autorité Intermédiaire.

Command
cat /root/ca/intermediate_ca/certs/intermediate.cert.pem \
    certs/ca.cert.pem > /root/ca/intermediate_ca/certs/ca-chain.cert.pem

chmod 444 /root/ca/intermediate_ca/certs/ca-chain.cert.pem

Remarque: notre fichier de la chaine de certification doit contenir le certificat de l'Autorité Racine car aucun de nos applications clientes ne le connait. Une meilleure option, surtout vous administrez un intranet serait d'installer le certificat de l'Autorité Racine sur tous les clients. Dans ce cas, le fichier de la chaine de certification peut ne contenir que le certificat de l'Autorité Intermédiaire.


Liste des articles concernés: