2.1. Installation

De nos jours l'installation d'OpenSSL ne soulève guère de difficultés. Les distributions incluent des gestionnaires de paquets. Reportez-vous à la documentation de votre distribution ou aux fichiers README et INSTALL qu'inclut l'archive tar d'OpenSSL. Ce guide pratique n'a pas pour objectif de traiter de l'installation mais de l'utilisation.

Je décris quelques options d'installation standard dont la connaissance est nécessaire pour les exemples qui suivent. Votre installation peut différer.

Les certificats OpenSSL sont stockés dans /var/ssl. Toutes les commandes et répertoires de ce document partent de /var/ssl. Ce n'est pas indispensable mais les exemples en sont facilité.

OpenSSL cherche par défaut son fichier de configuration dans /usr/lib/ssl/openssl.cnf. Ajoutez donc systématiquement -config /etc/openssl.cnf aux commandes telles openssl ca et openssl req (par exemple). Je me sers de /etc/openssl.cnf pour maintenir l'ensemble des fichiers de configuration dans /etc.

Les utilitaires et diverses bibliothèques se trouvent dans /usr/lib/ssl

2.1.1. L'utilitaire CA.pl

Vérifiez que CA.pl se trouve dans un répertoire qui figure dans le chemin d'accès par défaut aux programmes. Il peut se trouver dans le répertoire /usr/lib/ssl. CA.pl permet de masquer la complexité des commandes openssl. Je l'utilise dans tous les exemples en indiquant entre crochets l'équivalent openssl.

Modifiez CA.pl de façon à ce que les appels à openssl ca et openssl req incluent l'option -config /etc/openssl.cnf.

#$SSLEAY_CONFIG=$ENV{"SSLEAY_CONFIG"};
$SSLEAY_CONFIG="-config /etc/openssl.cnf";
#$CATOP="./demoCA";
$CATOP="/var/ssl";

2.1.2. Le fichier openssl.cnf

/etc/openssl.cnf doit être configuré de façon à minimiser les données à renseigner à chaque invocation des utilitaires.

#---Begin---
#
# Fichier de configuration pour OpenSSL.
# S'emploie surtout pour les demandes de certificats.
#
# NdT: autre chose que de l'ASCII dans les fichiers de
# configuration me rend nerveux. Il y a donc un zest de triche
# dans ce qui suit. Vous ne voudriez pas me rendre nerveux, non ? :o)
#
RANDFILE  = $ENV::HOME/.rnd
oid_file  = $ENV::HOME/.oid
oid_section  = new_oids
# Section des extension X.509v3 pour se servir du
# fichier avec l'option -extfile de la commande
# "openssl x509"
# extensions  =
# (Variante: employer un fichier de configuration qui
# n'a que des extensions X.509v3 dans sa section
# principale [= default])
[ new_oids ]
# On ajoute des OID pour les commandes 'ca' et 'req'.
# Par exemple:
# testoid1=1.2.3.4
# L'emploi de substitutions est possible:
# testoid2=${testoid1}.5.6
####################################################################
[ ca ]
default_ca = CA_default  # Section de la CA standard
####################################################################
[ CA_default ]
dir             = /var/ssl                # Emplacement de base
certs           = $dir/certs              # Emplacement de stockage des nouveaux certificats
crl_dir         = $dir/crl                # Emplacement des nouvelles CRL
database        = $dir/index.txt          # Fichier d'index
new_certs_dir   = $dir/newcerts           # Emplacement des nouveaux certificats
certificate     = $dir/cacert.pem         # Certificat de la CA
serial          = $dir/serial             # Numero de serie en cours
crl             = $dir/crl.pem            # CRL en cours
private_key     = $dir/private/cakey.pem  # Clef privee
RANDFILE        = $dir/private/.rand      # Fichier d'alea
x509_extensions = usr_cert                # Extensions pour les certificats
# Extensions pour la CRL. Remarque: Netscape communicator n'aime pas les CRL de version 2,
# on commente donc pour avoir une CRL version 1
# crl_extensions = crl_ext
default_days    = 365                     # Duree de vie d'un certificat
default_crl_days= 7                       # Intervalle entre CRLs
default_md      = sha1                    # Algorithme de hachage
preserve        = no                      # Conserve-t-on l'ordre du DN ?
# Diverses facons de specifier l'allure des requetes
# Pour une requete de type CA, les attributs doivent etre les memes
# Les champs 'optional' et 'supplied' correspondent respectivement
# a des champs optionnels et fournis :o)
policy  = policy_match
# Typage CA
[ policy_match ]
countryName            = match
stateOrProvinceName    = optional
localityName           = match
organizationName       = match
organizationalUnitName = optional
commonName             = supplied
emailAddress           = optional
# Typage tout-venant
# Tous les types d'objets acceptables doivent etre enumeres
[ policy_anything ]
countryName            = optional
stateOrProvinceName    = optional
localityName           = optional
organizationName       = optional
organizationalUnitName = optional
commonName             = supplied
emailAddress           = optional
####################################################################
[ req ]
default_bits       = 1024
default_keyfile    = privkey.pem
distinguished_name = req_distinguished_name
attributes         = req_attributes
default_md         = sha1
x509_extensions    = v3_ca # Extensions pour un certificat auto-signant
# Mot de passe pour les clefs privees (l'application le demande s'il est vide).
# input_password = secret
# output_password = secret
# Masque pour les types de chaines valides. Plusieurs choix sont possibles.
# default: PrintableString, T61String, BMPString.
# pkix : PrintableString, BMPString.
# utf8only: only UTF8Strings.
# nombstr : PrintableString, T61String (pas de BMPStrings ni de UTF8Strings).
# MASK:XXXX valeur litterale.
# Attention: certaines versions de Netscape plantent sur les BMPStrings ou les UTF8Strings.
# A utiliser avec prudence!
string_mask = nombstr
# req_extensions = v3_req # Extensions pour une demande de certificat
[ req_distinguished_name ]
countryName         = Nom du pays (code sur 2 lettres)
countryName_default = FJ
countryName_min     = 2
countryName_max     = 2
stateOrProvinceName         = Etat ou province (nom complet)
stateOrProvinceName_default = Fiji
localityName          = Ville
localityName_default  = Suva
0.organizationName         = Organisation (nom de l'entreprise par exemple)
0.organizationName_default = SOPAC
# Possible mais pas normalement pas necessaire :-)
#1.organizationName         = Second nom de l'organization
#1.organizationName_default = World Wide Web SARL
organizationalUnitName         = Nom du departement dans l'organisation
organizationalUnitName_default = ITU
commonName       = Nom d'usage
commonName_max   = 64
emailAddress     = Addresse e-mail
emailAddress_max = 40
# SET-ex3   = SET extension number 3
[ req_attributes ]
challengePassword     = Un mot de passe de challenge
challengePassword_min = 4
challengePassword_max = 20
unstructuredName      = Nom optionnel
[ usr_cert ]
# Extensions ajoutees quand 'ca' signe une requete.
# Contraire aux suggestions PKIX mais des CA le font et certains
# logiciels le demandent pour ne pas confondre un certificat
# utilisateur avec un certificat de CA
basicConstraints=CA:FALSE
# Examples d'utilisation de nsCertType. En cas d'omission,
# le certificat peut servir a tout sauf a signer des objets
# Serveur SSL
# nsCertType   = server
# Certificat promis a signer des objets.
# nsCertType = objsign
# Client normal.
# nsCertType = client, email
# Tout.
# nsCertType = client, email, objsign
# Classique pour un certificat client.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# Pour la boiboite de commentaire de Netscape.
nsComment  = "Certificate issued by https://www.sopac.org/ssl/"
# Recommandations PKIX sans effets secondaires facheux.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
# On importe l'adresse e-mail
# pour les attributs subjectAltName et issuerAltname.
# subjectAltName=email:copy
# Informations relatives au sujet.
# issuerAltName=issuer:copy
# Adresse de base des autres URL si on n'en donne pas
# au cas par cas.
nsBaseUrl  = https://www.sopac.org/ssl/
# Adresse de la CRL du moment.
nsCaRevocationUrl = https://www.sopac.org/ssl/sopac-ca.crl
# Adresse pour revoquer un certificat.
nsRevocationUrl  = https://www.sopac.org/ssl/revocation.html?
# Adresse pour renouveller un certificat.
nsRenewalUrl  = https://www.sopac.org/ssl/renewal.html?
# Adresse des pratiques de la CA.
nsCaPolicyUrl  = https://www.sopac.org/ssl/policy.html.
# Adresse du certificat du signataire.
issuerAltName = URI:https://www.sopac.org/ssl/sopac.crt.
# Adresse de la CRL du moment.
crlDistributionPoints = URI:https://www.sopac.org/ssl/sopac-ca.crl
[ v3_ca ]
# Extensions d'une CA standard
# Recommandation PKIX
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
# Recommandation PKIX que certains bugware n'aiment pas
# basicConstraints = critical,CA:true
# On utilise donc plutot ceci
basicConstraints = CA:true
# Emploi de la clef: typique d'un certificat de CA.
# On le laisse inactif pour prevenir l'emploi d'un
# certificat auto-signant de test.
# keyUsage = cRLSign, keyCertSign
# En fonction des besoins.
# nsCertType = sslCA, emailCA
# On inclut l'adresse e-mail dans le nom alternatif du sujet (recommendation PKIX)
# subjectAltName=email:copy
# On copie les informations du signataire
# issuerAltName=issuer:copy
# Encodage DER en base 16 d'une extension: licence de pilotage requise!
# 1.2.3.5=RAW:02:03
# On peut surcharger une extension standard:
# basicConstraints= critical, RAW:30:03:01:01:FF
# Message pour la boite d'affichage de Netscape.
nsComment  = "Certificat en provenance de https://www.sopac.org/ssl/"
# Adresse de base des autres URL si on n'en donne pas
# au cas par cas.
nsBaseUrl  = https://www.sopac.org/ssl/
# Adresse de la CRL du moment.
nsCaRevocationUrl = https://www.sopac.org/ssl/sopac-ca.crl
# Adresse pour revoquer un certificat.
nsRevocationUrl  = https://www.sopac.org/ssl/revocation.html?
# Adresse pour renouveller un certificat.
nsRenewalUrl  = https://www.sopac.org/ssl/renewal.html?
# Adresse des pratiques de la CA.
nsCaPolicyUrl  = https://www.sopac.org/ssl/policy.html
# Adresse du certificat du signataire.
issuerAltName = URI:https://www.sopac.org/ssl/sopac.crt
# Adresse de la CRL du moment.
crlDistributionPoints = URI:https://www.sopac.org/ssl/sopac-ca.crl
[ crl_ext ]
# Extensions de CRL
# Seuls issuerAltName et authorityKeyIdentifier se justifient dans une CRL.
# issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always,issuer:always
#----End----

Quelques remarques au sujet du fichier openssl.cnf

dir :

répertoire de base.

default_ca :

désigne la section des variables pour un certificat dont le type n'est pas spécifié.

basicConstraints :

définit l'usage du certificat. CA:TRUE désigne un certificat de CA racine par exemple.

2.1.3. Création de l'autorité de certification

Utilisez la commande suivante après avoir modifié de façon adéquate le fichier openssl.cnf :

CA.pl -newca

L'utilitaire demande de choisir un fichier contenant le certificat de l'AC ou bien il propose d'en créer un. A titre d'exercice, laissez vous guider dans la création d'une AC. La partie suivante remplace cette AC par une AC de durée de vie plus importante. CA.pl ne génère que des certificats valables 365 jours.