Avoir et installer un certificat SSL https gratuitement

Toujours dans l’optique d’améliorer la sécurité de votre site, vous avez pensé acheter un certificat. Mais un certificat, cela a un coût… Payer une rente annuelle pour sécuriser un flux smtp, ftp ou autres avec un certificat authentifié est hors de vos moyens.
Mais ça, c’etait avant, maintenant grâce à letsencrypt, à vous les certificats SSL valides mais sans assurance sur les transactions financières. Ils sont donc parfait pour un site ou un service non e-commerce.

Comment ca marche ?

Afin de délivrer le certificat, letsencrypt vérifie que le nom de domaine est bien relié à l’ip déclarée dans le dns. Pour cela, il monte un mini serveur http pour effectuer une connexion au service afin d’authentifier la demande de certificat. C’est pour cela que lors de la génération ou le renouvellement d’un certificat il faut arrêter apache.

Pré-requis

Si vous copier-coller mes virtualhosts, avoir installé chronolog.
Les sites sont placés dans le dossier /var/www avec comme architecture de dossier :

  • log
  • tmp
  • html

Installation

Il faut commencer par installer letsencrypt sur son serveur, la procédure est différente entre Debian 7 et une Debian 8. La Debian 8 permet maintenant l’utilisation du package.

Debian 7

On choisi d’installer le script certbot directement dans le dossier /var/ice/script/shell/

cd /opt/
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

Debian 8

Il faut commencer par activer les backports de debian

echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/apt/sources.list
apt-get update
apt-get install certbot -t jessie-backports

Générez vos certificats

Pour info : on peut générer plusieurs certificats en une ligne en ajoutant des -d nomdedomaine.com
Remplacer évidemment nomdedomaine.com par la valeur du nom de domaine sans les www pour les racines.

Debian 7

cd /opt/
./certbot-auto certonly --standalone -d nomdedomaine.com --pre-hook "/etc/init.d/apache2 stop" --post-hook "/etc/init.d/apache2 start"

Debian 8

certbot certonly --standalone -d nomdedomaine.com --pre-hook "service apache2 stop" --post-hook "service apache2 start"

Renouvellement des certificats

Debian 7

cd /opt/
./certbot-auto renew --pre-hook "/etc/init.d/apache2 stop" --post-hook "/etc/init.d/apache2 start"

Debian 8

certbot renew --pre-hook "service apache2 stop" --post-hook "service apache2 start"

Configuration apache

on utilise deux mods

a2enmod headers
a2enmod ssl

le mode ssl gère les multi ssl avec une ip

ATTENTION :

Header always set Strict-Transport-Security envoie une commande via le header au navigateur qui va pendant le temps exprimé, forcer le navigateur à passer en HTTPS, même si vous avez désactivé le https ou mis un htaccess après. Cela reste dans le cache du navigateur.

Exemple de virtualhost


ServerName www.site.fr
ServerAlias site.fr
DocumentRoot /var/www/www.site.fr/html
LogLevel warn

ErrorLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/error_log »
CustomLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/access_log » combined
TransferLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/transfer_log »

php_admin_value auto_prepend_file none
php_admin_value open_basedir /var/www/www.site.fr:/tmp
php_admin_value upload_tmp_dir /var/www/www.site.fr/tmp
php_admin_value session.save_path /var/www/www.site.fr/tmp

SetEnv AWSTATS_FORCE_CONFIG www.site.fr

SSLEngine On
SSLCertificateKeyFile /etc/letsencrypt/live/www.site.fr/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/www.site.fr/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.site.fr/chain.pem

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-RSA-AES128-GCM-SHA256: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-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256: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

SSLHonorCipherOrder on
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
SSLCompression Off

# HSTS (mod_headers est requis, 15 768 000 secondes = 6 mois)
Header always set Strict-Transport-Security « max-age=15768000

Virtualhost pour debian 6


ServerName www.site.fr
ServerAlias site.fr

DocumentRoot /var/www/www.site.fr/html

LogLevel warn

ErrorLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/error_log »
CustomLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/access_log » combined
TransferLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/transfer_log »

php_admin_value auto_prepend_file none
php_admin_value open_basedir /var/www/www.site.fr:/tmp
php_admin_value upload_tmp_dir /var/www/www.site.fr/tmp
php_admin_value session.save_path /var/www/www.site.fr/tmp

SetEnv AWSTATS_FORCE_CONFIG www.site.fr

SSLEngine on

SSLCertificateKeyFile /etc/letsencrypt/live/www.site.fr/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/www.site.fr/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.site.fr/chain.pem

<FilesMatch « \.(cgi|shtml|phtml|php)$ »>
SSLOptions +StdEnvVars

SSLOptions +StdEnvVars

BrowserMatch « .*MSIE.* » \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

on active et on recharge apache

a2ensite www.site.fr.conf
apache2ctl graceful

Lexique commande

certonly : pour la création de certificat
renew : Pour le renouvellement
–dry-run : mode test
-q : mode silencieux sans sortie dans le shell
–force-renewal : pour forcer le renouvellement même si il n’est pas encore temps de le renouveler.
–email : pour spécifier un email différent de celui par défaut généré lors de la première utilisation
–rsa-key-size : taille de la clé RSA par défaut 2018
–pre-hook : Pour lancer une commande avant que certbot fasse l’action
–post-hook : Pour lance une commande après que certbot ait fonctionné.

Cas spécial pour les os non supportés.

L’astuce est valable si vous avez deux serveurs dont un avec une Debian. Il suffit de bouger les dns sur le serveur pouvant générer le certificat et de générer les fichiers.
Recopier les certificats dans le dossier /etc/letsencrypt sur la machine d’origine. Attention n’utilisez pas cette technique pour un service critique.

Test

Pour vérifier que votre serveur apache, votre virtualhost et votre certificat marchent correctement, rien de plus simple, il suffit de se rendre à cette adresse :

https://www.ssllabs.com/ssltest/

Et voila le résultat :

resultat test ssl site

Inconvénient

Il y a néammoins un inconvénient avec letsencrypt, les certificats sont valables que 2 mois … Il faut penser à renouveler vos certificats.

J’ai pour cela une astuce : nous allons utiliser le crontab et y mettre cette commande.


30 3 10 * * ./certbot-auto renew --pre-hook "/etc/init.d/apache2 stop" --post-hook "/etc/init.d/apache2 start"

Conclusion

Maintenant vous avez un site en https et en plus A+ d’après qualys et sans avoir débourser d’argent.

 

Un commentaire

Laisser un commentaire