CentOS7: private PKI : Création de l'Autorité Racine

De Pegasus45

Création de l'Autorité Racine

Se comporter comme une Autorité de Certification (CA) consiste à délivrer une paire de certificats numériques (un certificat privé et un certificat publique). La première chose à faire est donc de créer une paire de certificats pour l'Autorité Racine (Root CA). Cela consiste à créer un certificat privé (ca.key.pem) et un certificat publique (ca.cert.pem). Cette paire de fichiers forme l'identité du CA.

Généralement, l'Autorité Racine (Root CA) ne délivre pas de certificats pour les serveurs ou les utilisateurs. Le Root CA ne délivre des certificats que pour une ou plusieurs Autorités Intermédiaires. Ce sont les Autorités Intermédiaires qui délivrent des certificats pour les serveurs et les utilisateurs. Il s'agit d'une bonne pratique. Ainsi, cela permet de déconnecter physiquement le Root CA du réseau, voir de l'éteindre complètement, et de l'enfermer dans un endroit sûr. En cas de compromission d'une Autorité Intermédiaire, il suffit de révoquer les paires de certificats de cette Autorité à l'aide de l'Autorité Racine et de recréer une nouvelle paire de certificats pour l'Autorité Intermédiaire.

Création des répertoires

On choisit un répertoire pour stocker tous les certificats

Command
mkdir -p /root/ca/root_ca

On crée l'arborescence des répertoires. Les fichiers index.txt et serial sont utilisés comme une base de données (de type fichier plat) pour garder un suivi des certificats signés.

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


Préparation du fichier de configuration

On doit créer le fichier de configuration pour OpenSSL:

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

[ ca ]
# `man ca`
default_ca = CA_default

[ CA_default ]
# Directory and file locations.
dir               = /root/ca/root_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/ca.key.pem
certificate       = $dir/certs/ca.cert.pem

# For certificate revocation lists.
crlnumber         = $dir/crlnumber
crl               = $dir/crl/ca.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_strict

[ 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 de Root CA

On crée la clé privée de Root CA (ca.key.pem) et on doit absolument la garder en lieu sûr. Quiconque récupère cette clé pourra créer des certificats valides. On chiffre la clé en AES-256 et on utilise un mot de passe fort.

Remarque: Utilisez un chiffrement 4096bits pour la clé privée de toutes les Autorité Racine (Root CA) et les Autorité Intermédiaire (Intermediate CA). Vous pouvez utiliser un chiffrement plus faible pour les certificats serveurs et clients.

Command
cd /root/ca/root_ca

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


chmod 400 private/ca.key.pem


Création du certificat de Root CA

On va utiliser la clé privée qu'on vient de créer (ca.key.pem) pour créer le certificat de Root CA (ca.cert.pem). Donnez à ce certificat une date d'expiration lointaine (20 ans). Un fois ce certificat expiré, tous les certificats signés par cette Autorité seront invalides.

Remarque: A chaque utilisation de l'utilitaire req, on doit toujours spécifier le fichier de configuration qu'on souhaite utiliser grâce à l'option "-config", sinon OpenSSL utilisera le fichier par défaut /etc/pki/tls/openssl.cnf.

Command
cd /root/ca/root_ca

openssl req -config openssl.cnf \
      -key private/ca.key.pem \
      -new -x509 -days 7300 -sha256 -extensions v3_ca \
      -out certs/ca.cert.pem
============================================================
Enter pass phrase for private/ca.key.pem:  secret_root_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 Root CA
Email Address []:
============================================================

chmod 444 certs/ca.cert.pem


Vérification du certificat de Root CA

Command
openssl x509 -noout -text -in certs/ca.cert.pem

On peut voir:

  • l'algorithme utilisé (Signature Algorithm: sha256WithRSAEncryption)
  • les dates du certificat (Not Before: Feb 22 10:16:40 2016 GMT et Not After : Feb 17 10:16:40 2036 GMT)
  • la longueur de la clé (Public-Key: (4096 bit))
  • celui qui a signé la clé (Issuer)
  • pour qui est cette clé (Subject)

Le "Issuer" et le "Subject" sont identiques, comme pour un certificat auto-signé. Notez que tous les certificats Racine (Root CA) sont des auto-signés.

Command
============================================================
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 13124756090375928305 (0xb6248020528079f1)
    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 10:16:40 2016 GMT
            Not After : Feb 17 10:16:40 2036 GMT
        Subject: C=FR, ST=Loiret, L=Orleans, O=Pegasus45, OU=Pegasus45 Certificate Authority, CN=Pegasus45 Root CA
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
============================================================

On peut également y voir les "X509v3 extensions". Comme nous avons utilisé l'extension "v3_ca", les options de la section [v3_ca] sont visibles à l'écran:

Command
============================================================
X509v3 extensions:
    X509v3 Subject Key Identifier: 
        24:82:CC:80:21:C5:30:14:36:87:A2:B9:10:EE:69:E6:BB:A8:C1:17
    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
    X509v3 Key Usage: critical
        Digital Signature, Certificate Sign, CRL Sign
============================================================



Liste des articles concernés: