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.
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
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
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.
openssl x509 -in ${HOSTNAME}-ca.crt -text -noout
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}
openssl genrsa -des3 -out ${HOSTNAME}-${SERVICE}.key 1024 chmod 400 ${HOSTNAME}-${SERVICE}.key
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”.
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
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)
export USER="monuser" openssl pkcs12 -export -in ${HOSTNAME}-${USER}.crt -inkey ${HOSTNAME}-${USER}.key -out ${HOSTNAME}-${USER}.p12 -name "${USER}"
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.
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.