Ce petit article va nous permet de comprendre comment créer un certificat SSL pour apache en utilisant les certificats de let's encrypt. Attention à l'heure ou j'écris cet article, il n'est pas recommandé d'utiliser les certificats sur un serveur de production. Si vous avez des certificats auto-signé, vous pouvez toujours les remplacer par ceux de LE.
Nous allons commencer par télécharger un petit outil qui va nous permettre de créer notre certificat, cette outil est plus simple que le client proposé par Let's Encrypt. Personnellement, je le trouve un peu lourd avec ses plugins. ACME est un petit outil de 200 lignes, facile a auditer si besoin
$ cd /usr/local/src/
$ git clone https://github.com/diafygi/acme-tiny.git
Voilà ACME est sur notre serveur, nous allons créer un répertoire letencrypt sur notre serveur pour stocker nos clef, certificats, chaine, etc ...
$ mkdir /etc/letencrypt
$ cd /etc/letencrypt/
Nous allons créer deux clés privées. L'une des clef privée va nous permettre de nous identifier et l'autre pour identifier le serveur.
$ openssl genrsa 4096 > clef_privee_perso.key
$ openssl genrsa 4096 > clef_privee_machine.key
Nous allons créer un Certificate Signing Request (CSR) pour faire notre demande de certificat chez Let's Encrypt. Ce formulaire nous permettra de faire notre demande de renouvellement par la suite.
$ openssl req -new -sha256 -key clef_privee_machine.key -subj "/CN=jedegage.info" > formulaire_de_demande.csr
Nous allons chercher le certificat intermédiaire de Let's Encrypt, ce certificat permet d'éviter des avertissements. Celà marche sans, mais autant l'avoir sur son serveur
$ wget https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem
Lors de la création du certificat, Let's Encrypt va devoir dialoguer avec le serveur pour fourni un token (jeton), nous allons créer un répertoire pour permettre à Let's Encrypt de nous identifier.
$ mkdir -p /home/www/jedegage.info/web/.well-known/acme-challenge/
C'est ici que nous allons faire notre demande de certificat, comme vu plus haut nous allons utiliser le petit script acme_tiny pour faire notre demande. Pour celà nous avons besoin de notre clef privée perso généré au début et notre formulaire de demande (le certificat a fournir à Let's Encrypt).
$ python /usr/local/src/acme-tiny/acme_tiny.py --account-key clef_privee_perso.key --csr ./formulaire_de_demande.csr --acme-dir /home/www/jedegage.info/web/.well-known/acme-challenge/ > ./certificat-domaines.pem
Il nous reste à modifier le virtual host d'apache pour configurer le domaine avec SSL.
$ vi /etc/apache2/sites-enabled/jedegage.info
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!DHE-RSA-AES128-GCM-SHA256:!DHE-RSA-AES256-GCM-SHA384:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES256-SHA:!DHE-RSA-AES128-SHA:!DHE-RSA-AES256-SHA256:!DHE-RSA-CAMELLIA128-SHA:!DHE-RSA-CAMELLIA256-SHA
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCertificateFile /etc/letencrypt/certificat-domaines.pem
SSLCertificateChainFile /etc/letencrypt/lets-encrypt-x1-cross-signed.pem
SSLCertificateKeyFile /etc/letencrypt/clef_privee_machine.key
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
Si vous avez besoin de configurer nginx sur votre serveur, je vous invite à vous reporter au README de acme-tiny pour celà.
A prendre en compte :
- Rate limit on registrations per IP is currently 10 per 3 hours
- Rate limit on certificates per Domain is currently 5 per 7 days
##Renouveler les certificats
$ cat /etc/crontab
# Renew certificat (runs once per month)
0 0 1 * * root /etc/letencrypt/renew_cert.sh 2>> /var/log/renewcert_letencrypt.log
$ cat /etc/letencrypt/renew_cert.sh
python /opt/certs/acme-tiny/acme_tiny.py --account-key /etc/letencrypt/clef_privee_perso.key --csr
/etc/letencrypt/formulaire_de_demande.csr --acme-dir /home/www/jedegage.info/web/.well-known/acme-challenge/
> /etc/letencrypt/jedegage.info.pem
wget -O /etc/letencrypt/lets-encrypt-x1-cross-signed.pem https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem