www.starend.org

TechNIX

Tags

ca autorité certification openbsd openssl

Création d'une autorité de certification

01/03/2006

Mise à jour du 16/05/2007

Introduction

Voici la configuration que j'ai adopté. Elle correspond à MES besoins.

Tout d'abord, la plateforme de la CA (autorité racine) n'est pas reliée au réseau. C'est une vieille station SUN SPARCstation20 sous OpenBSD 3.8 avec un vrai processeur Sparc à 150MHz (http://eintr.net/systems/sun/sparcstation20/index.html). Bon, ça rame un peu à la génération d'un nouveau bi-clé, mais j'ai le temps... c'est plaisir de la voir travailler :-)

J'utilise OpenSSL, forcément, mais pas la fonctionnalité de mini CA intégré (openssl ca ...). Je préfère taper toutes les commandes à la main avec des fichiers de configuration aux petits oignons. Evidement, ce sont mes fichiers pour ma CA, donc avec 'starend.org' un peu partout.

Le certificat de mon autorité racine se trouve sur mon site http://ca.starend.org. Si on vous le propose sur pirate.org, starend.com, le_vrai_starend.org, etc... c'est pas le bon, forcément.

Il y a deux étapes : la génération du certificat racine, et la génération des autres certificats. Et pour réaliser cela il y a trois scripts, un pour générer le certificat racine, un pour générer un certificat d'utilisateur, et un pour générer un certificat de serveur.

Génération d'une autorité racine (de confiance)

Créer le fichier de configuration personnalisé 'mkca.cnf' :

[ req ]
default_md			= sha1
distinguished_name		= req_distinguished_name
attributes			= req_attributes
string_mask			= default
policy				= policy_match

[ req_distinguished_name ]
countryName			= /C= Code pays (2 lettres)
countryName_default		= FR
countryName_min			= 2
countryName_max			= 2
#stateOrProvinceName		= /ST= Etat ou province (nom complet)
#stateOrProvinceName_default	= France
#localityName			= /L= Nom locale (ville)
#localityName_default		=
0.organizationName		= /O= Organination (societe)
0.organizationName_default	= starend.org
#organizationalUnitName		= /OU= Unitee organisationelle (section)
#organizationalUnitName_default	=
#commonName			= /CN= Nom dns complet du serveur
#commonName_default		=
#commonName_max			= 128
#emailAddress			= /emailAddress= Adresse email
#emailAddress_default		=
#emailAddress_max		= 128

[ req_attributes ]
challengePassword_min		= 8
challengePassword_max		= 100

[ policy_match ]
countryName			= supplied
stateOrProvinceName		= optional
organizationName		= supplied
organizationalUnitName		= optional
commonName			= optional
emailAddress			= optional

[ v3 ]
basicConstraints		= CA:TRUE
#keyUsage			= nonRepudiation, digitalSignature, keyEncipherment
#nsCertType			= server
nsComment			= "Generated by rouby@starend.org with OpenSSL"

Le certificat ici généré est valable 10 ans, et donc pourra régénérer tous les ans les certificats de tous les utilisateurs et serveurs... pendant 10 ans. C'est pour cela qu'il est composé d'un bi-clé de 4096 bits, pour pouvoir tenir dans le temps.

Générer le certificat racine de confiance avec le script 'mkca.sh' :

#!/bin/ksh
OLD=$(date +%Y%m%e-%H%M%S)
mv starend.org_ca.key copie_$OLD.starend.org_ca.key
mv starend.org_ca.crt copie_$OLD.starend.org_ca.crt
openssl genrsa -aes256 -out starend.org_ca.key 4096
openssl req -x509 -new -key starend.org_ca.key -out starend.org_ca.crt -config mkca.cnf -extensions v3 -days 3650 -set_serial 0
openssl x509 -text -in starend.org_ca.crt

Je précise quand même que l'on doit diffuser starend.org_ca.crt au maximum de personnes.

Mais ATTENTION, on ne doit sous aucun prétexte donner la clé privée starend.org_ca.key, sous peine d'invalider toute la confiance que l'on peut mettre dans cette autorité de certification... Au cas ou, le fichier contenant la clé privée est quand même protégé par un mot de passe. Deux protections valent mieux qu'une.

Génération d'un certificat d'utilisateur (email)

Créer le fichier de configuration personnalisé 'mkuser.cnf' :

[ req ]
default_md			= sha1
distinguished_name		= req_distinguished_name
attributes			= req_attributes
string_mask			= default
policy				= policy_match

[ req_distinguished_name ]
countryName			= /C= Code pays (2 lettres)
countryName_default		= FR
countryName_min			= 2
countryName_max			= 2
#stateOrProvinceName		= /ST= Etat ou province (nom complet)
#stateOrProvinceName_default	= France
#localityName			= /L= Nom locale (ville)
#localityName_default		=
0.organizationName		= /O= Organination (societe)
0.organizationName_default	= starend.org
#organizationalUnitName		= /OU= Unitee organisationelle (section)
#organizationalUnitName_default	=
commonName			= /CN= NOM Premon (pseudo)
commonName_default		=
commonName_max			= 128
emailAddress			= /emailAddress= Adresse email
emailAddress_default		=
emailAddress_max		= 128

[ req_attributes ]
challengePassword_min		= 8
challengePassword_max		= 100

[ policy_match ]
countryName			= supplied
stateOrProvinceName		= optional
organizationName		= supplied
organizationalUnitName		= optional
commonName			= supplied
emailAddress			= supplied

[ v3 ]
basicConstraints		= CA:FALSE
keyUsage			= nonRepudiation, digitalSignature, keyEncipherment
nsCertType			= client, email
#nsCertType			= client, email, Object Signing
nsComment			= "Generated by rouby@starend.org with OpenSSL"

Générer le certificat avec le script 'mkuser.sh' :

#!/bin/ksh
[ "$1" == "" ] && echo "$0 username" && exit 1
USER=$1
ID=$(date +%Y%m%d%H%M%S)
echo "++ Creation du certificat n°$ID pour l'utilisateur '$USER@starend.org'."
openssl genrsa -aes128 -out user.key 1024
openssl req -new -key user.key -out user.req -config mkuser.cnf
openssl x509 -req -in user.req -out user.crt -CA starend.org_ca.crt -CAkey starend.org_ca.key -set_serial $ID -days 365 -extfile mkuser.cnf -extensions v3
rm user.req
openssl pkcs12 -export -in user.crt -inkey user.key -out user.p12
openssl x509 -text -in user.crt
mv user.crt $USER.starend.org_user.crt
ln -s $USER.starend.org_user.crt user.crt.$ID
mv user.key $USER.starend.org_user.key
ln -s $USER.starend.org_user.key user.key.$ID
mv user.p12 $USER.starend.org_user.p12
ls -lh *$ID* *$USER*

Le bi-clé utilisé fait 1024 bits. Durée de validité : 1 an.

Il ne reste qu'à donne utilisateur.starend.org_user.p12 au nouvel utilisateur. Ce fichier est protégé par un mot de passe qui devra être transmit par un autre moyen...

Génération d'un certificat de serveur (ssl)

Créer le fichier de configuration personnalisé 'mkserver.cnf' :

[ req ]
default_md			= sha1
distinguished_name		= req_distinguished_name
attributes			= req_attributes
string_mask			= default
policy				= policy_match

[ req_distinguished_name ]
countryName			= /C= Code pays (2 lettres)
countryName_default		= FR
countryName_min			= 2
countryName_max			= 2
#stateOrProvinceName		= /ST= Etat ou province (nom complet)
#stateOrProvinceName_default	= France
#localityName			= /L= Nom locale (ville)
#localityName_default		=
0.organizationName		= /O= Organination (societe)
0.organizationName_default	= starend.org
#organizationalUnitName		= /OU= Unitee organisationelle (section)
#organizationalUnitName_default	=
commonName			= /CN= Nom dns complet du serveur
commonName_default		=
commonName_max			= 128
#emailAddress			= /emailAddress= Adresse email
#emailAddress_default		=
#emailAddress_max		= 128

[ req_attributes ]
challengePassword_min		= 8
challengePassword_max		= 100

[ policy_match ]
countryName			= supplied
stateOrProvinceName		= optional
organizationName		= supplied
organizationalUnitName		= optional
commonName			= supplied
emailAddress			= optional

[ v3 ]
basicConstraints		= CA:FALSE
#keyUsage			= nonRepudiation, digitalSignature, keyEncipherment
nsCertType			= server
nsComment			= "Generated by rouby@starend.org with OpenSSL"

Générer le certificat avec le script 'mkserver.sh' :

#!/bin/ksh
[ "$1" == "" ] && echo "$0 username" && exit 1
SRV=$1
ID=$(date +%Y%m%d%H%M%S)
echo "++ Creation du certificat n°$ID pour le serveur '$SRV.starend.org'."
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.req -config mkserver.cnf
openssl x509 -req -in server.req -out server.crt -CA starend.org_ca.crt -CAkey starend.org_ca.key -set_serial $ID -days 365 -extfile mkserver.cnf -extensions v3
rm server.req
openssl x509 -text -in server.crt
mv user.crt $SRV.starend.org_server.crt
ln -s $SRV.starend.org_server.crt server.crt.$ID
mv user.key $SRV.starend.org_server.key
ln -s $SRV.starend.org_server.key server.key.$ID
mv user.p12 $SRV.starend.org_server.p12
ls -lh *$ID* *$SRV*

Le bi-clé utilisé fait 1024 bits. Durée de validité : 1 an.

Et on fournit à l'administrateur du serveur les fichiers serv.starend.org_server.crt et serv.starend.org_server.key.Pour des besoins opérationnels, le fichier de clé privée peut ne pas être protégé par un mot de passe. Attention... Pour certains serveurs comme Apache2 ou wu-imapsd, le fichier final utilisé est la concaténation des deux fichiers précédents.

Licence Creative Common 2007 :: BY-NC-SA :: Webdesign DENDIEVEL Stéphane