Créer sa propre Autorité de Certification (AC) ou CA en anglais

Bien le bonjournasse ami lutingue, aujourd'hui on va faire un gros HOWTO (bouuuuh le vilain, un HOWTO, y'a papa Théo qui va encore sévir en voyant ça) pour créer sa propre autorité de certification, afin de se faire ses propres certificats tous beaux. Ce mécanisme s'appelle une PKI dans la langue des rosbifs, et une IGC dans la langue des grenouilles. Je vous renvoie (comme souvent) à la doc de Wikipedia qui vous expliquera ça dans un français meilleur que le mien.

Cette CA, dont vous diffuserez le certificat (clef publique) sur toutes vos machines et à tous vos amis qui ont des comptes mail-ssl ou https chez vous, vous permettra de créer une hiérarchie de confiance afin de créer un certificat par service par machine.

Ce tip présuppose que vous compreniez au moins vaguement les notions de cryptographie à base de clefs asymétriques. Si la phrase que vous venez de lire vient de vous filer un mal de crâne, je vous propose de vous rendre sur le lien suivant (SFW!!), qui vous permettra de mieux comprendre de quoi il en retourne (et puis bon, je ne vais pas me mettre à paraphraser Wikipedia…

Toutes ces manipulations supposent que vous êtes r00t.

Génération de notre propre Autorité de Certification

On se crée un joli endroit dans /etc/ssl pour stocker la biclef.

export HOSTNAME=`hostname`
cd /etc/ssl
mkdir CA
cd CA
touch index.txt
echo "01" > crlnumber
cd /etc/ssl

Génération de la clé

On génère la clef privée de notre CA.

openssl genrsa -des3 -out ${HOSTNAME}-ca.key 2048

On va vous demander un mot de passe. Il est évident que ce mot de passe doit être d'une solidité à tout épreuve, car si vous divulguez ou que vous vous faites voler votre clef privée de votre certificat racine, vous foutez toute la sécurité en l'air.

Seul r00t a le droit de la lire.

chmod 400 ${HOSTNAME}-ca.key

Génération du certificat

On génère un certificat auto-signé.

openssl req -new -x509 -days 3650 -key ${HOSTNAME}-ca.key -out ${HOSTNAME}-ca.crt

On peut rentrer comme paramètres ce qui suit.

      Unite d'organisation OU = Secure Server Certification Authority
      Organisation O = Pinpin Data Security, Inc.
      Pays C = FR
      Nom commun CN = <rien> ou ce qui est dans le champ "O"

On génère aussi la liste de révocation

openssl ca -gencrl -keyfile CA/${HOSTNAME}-ca.key -cert CA/${HOSTNAME}-ca.crt -out CA/${HOSTNAME}-ca.crl

Il faut également éditer le fichier /etc/ssl/openssl.cnf avec les données qui vont bien pour les variables comme dir, certificate, crl and private_key.

Pour voir le certificat, on peut utiliser la commande suivante

openssl x509 -in ${HOSTNAME}-ca.crt -text -noout

Créer une clé et un certificat pour un serveur quelconque (Web, SMTP, POP etc)

Par exemple, si c'est pour un serveur web, vous pouvez procéder comme suit :

export SERVICE="www"
cd /etc/ssl
mkdir ${SERVICE}
cd ${SERVICE}

Génération de la clef privee

openssl genrsa -des3 -out ${HOSTNAME}-${SERVICE}.key 1024
chmod 400 ${HOSTNAME}-${SERVICE}.key

Génération du certificat à faire signer par l'AC

openssl req -new -key ${HOSTNAME}-${SERVICE}.key -out ${HOSTNAME}-${SERVICE}.csr

Il est EXCESSIVEMENT important que vous indiquiez bien le Fully Qualified Domain Name du nom sous lequel vos clients accéderont au service considéré.

      [...]
      Common Name (eg, YOUR name) []:FQDN
      [...]

Par exemple, si votre serveur de e-commerce est accessible aux clients via l'url https://lolboutique.gruik-commerce.com/, vous devrez indiquer en FQDN “lolboutique.gruik-commerce.com”.

Méthode alternative

On peut, à la place des deux étapes du dessus (pour ne pas avoir de passphrase), effectuer la passe suivante.

openssl req -new -nodes -out ${HOSTNAME}-${SERVICE}.pem -keyout ${HOSTNAME}-${SERVICE}.key

Signature de la demande par le CA

openssl x509 -req -in ${HOSTNAME}-${SERVICE}.csr -out ${HOSTNAME}-${SERVICE}.crt -sha1 -CA /etc/ssl/CA/${HOSTNAME}-ca.crt -CAkey /etc/ssl/CA/${HOSTNAME}-ca.key -CAcreateserial -days 3650

ou, si vous avez suivi la méthode alternative du dessus

openssl x509 -req -in ${HOSTNAME}-${SERVICE}.pem -out ${HOSTNAME}-${SERVICE}.crt -sha1 -CA /etc/ssl/CA/${HOSTNAME}-ca.crt -CAkey 
/etc/ssl/CA/${HOSTNAME}-ca.key -CAcreateserial -days 3650 && rm ${HOSTNAME}-${SERVICE}.pem

ATTENTION: ce certificat et cette clé seront valides pour uniquement pour un serveur ayant le nom FQDN spécifié. Il faudra générer autant de couple clé/certificat que le serveur hébergera de Virtual Host (en supposant que vous ayiez plusieurs IP sur la babasse)

L'export p12

export USER="monuser"
openssl pkcs12 -export -in ${HOSTNAME}-${USER}.crt -inkey ${HOSTNAME}-${USER}.key -out ${HOSTNAME}-${USER}.p12 -name "${USER}"

La révocation d'un certificat

openssl ca -revoke ${HOSTNAME}-${USER}.crt -keyfile /etc/ssl/CA/${HOSTNAME}-ca.key -cert /etc/ssl/CA/${HOSTNAME}-ca.crt
openssl ca -gencrl -crlexts crl_ext -md sha1 -out CA/${HOSTNAME}-ca.crl

On révoque le certificat et on met à jour la liste des révocations.

Bonus, la conf Apache

SSLCertificateFile /etc/ssl/www/${HOSTNAME}-www.crt
SSLCertificateKeyFile /etc/ssl/www/${HOSTNAME}-www.key
SSLCertificateChainFile /etc/ssl/CA/${HOSTNAME}-ca.crt
SSLCACertificateFile /etc/ssl/CA/${HOSTNAME}-ca.crt
SSLCARevocationFile /etc/ssl/CA/${HOSTNAME}-ca.crl

Il faut aussi publier le certificat de l'AC, donc copier /etc/ssl/CA/${HOSTNAME}-ca.crt dans un répertoire web et ajouter

AddType application/x-x509-ca-cert .crt

SSLCARevocationFile va nous servir lors des futures révocations

ChangeLog
10 mai 2007: créée – mat
25 Sept. 2008: mise à jour – jadawin


TODO: certificats de révocation.

unix/openssl_et_ac.txt · Last modified: 2010/01/12 13:29 (external edit)