La page du Wiki concernant ce T&A => Letsencrypt
Je l'utilise depuis plus d'un mois maintenant, et je suis n'ai pas trouvé quoi que ce soit à redire sur ce soft, et les service qu'il offre:
Créer votre certificat SSL, que ce soit pour votre domaine ou votre sous-domaine, simplement et gratuitement... Que demander de plus ?
Le tuto ci-dessous est pour une Jessie avec Apache2. Évidemment c'est possible avec Nginx, mais je n'en ai pas sous la main pour configurer le mod-proxy.
S'il y a un volontaire qu'il se manifeste...
Il y a bien un paquet Debian, mais il m'a posé des problèmes (de sombres histoires de dépendances python que je n'ai pas cherché à résoudre...).
Code : Tout sélectionner
# apt-get install -s python-letsencrypt
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Certains paquets ne peuvent être installés. Ceci peut signifier
que vous avez demandé l'impossible, ou bien, si vous utilisez
la distribution unstable, que certains paquets n'ont pas encore
été créés ou ne sont pas sortis d'Incoming.
L'information suivante devrait vous aider à résoudre la situation :
Les paquets suivants contiennent des dépendances non satisfaites :
python-letsencrypt : Dépend: python-acme (>= 0.4.1) mais ne sera pas installé
Dépend: python-cryptography (>= 0.7) mais 0.6.1-1 devra être installé
Recommande: letsencrypt mais ne sera pas installé
E: Impossible de corriger les problèmes, des paquets défectueux sont en mode « garder en l'état ».
Code : Tout sélectionner
# apt-listbugs list python-letsencrypt-apache
Récupération des rapports de bogue… Fait
Analyse des informations Trouvé/Corrigé… Fait
bogues de gravité serious sur python-letsencrypt-apache (→ ) <Résolus dans une version donnée>
b1 - #818696 - Fails to build twice - clean does not clean enough (Corrigé : python-letsencrypt-apache/0.5.0-1)
Résumé :
python-letsencrypt-apache(1 bogue)
1) Prérequis: activer et configurer le serveur Web:
SI vous êtes sur APACHE2:
Code : Tout sélectionner
a2enmod proxy proxy_http
Code : Tout sélectionner
$editeur /etc/apache2/mods-enabled/proxy.conf
Code : Tout sélectionner
<IfModule mod_proxy.c>
ProxyPass "/.well-known/acme-challenge/" "http://127.0.0.1:9999/.well-known/acme-challenge/" retry=1
ProxyPassReverse "/.well-known/acme-challenge/" "http://127.0.0.1:9999/.well-known/acme-challenge/"
<Location "/.well-known/acme-challenge/">
ProxyPreserveHost On
Order allow,deny
Allow from all
Require all granted
</Location>
</IfModule>
Code : Tout sélectionner
apache2ctl restart
La première chose à rajouter est l'écriture suivante, dans la section 'server' :
Code : Tout sélectionner
location '/.well-known' {
allow all;
}
location '/.well-known/acme-challenge' {
allow all;
}
Code : Tout sélectionner
nginx -t
service nginx reload
Code : Tout sélectionner
# apt-get install git
# cd /opt && git clone https://github.com/letsencrypt/letsencrypt
3) Premier lancement et création du premier certificat:
Attention!: Un DNS doit être configuré, et renvoyer sur votre serveur Web, sinon ça ne fonctionne pas. Il faut donc pré-configurer un vhost.
La commande magique:
Code : Tout sélectionner
cd /opt/letsencrypt/ && ./letsencrypt-auto --agree-tos --renew-by-default --standalone --standalone-supported-challenges http-01 --http-01-port 9999 --server https://acme-v01.api.letsencrypt.org/directory certonly -d domaine.tld
Ainsi il sera valide pour tous vos vhosts.
Code : Tout sélectionner
cd /opt/letsencrypt/ && ./letsencrypt-auto --agree-tos --renew-by-default --standalone --standalone-supported-challenges http-01 --http-01-port 9999 --server https://acme-v01.api.letsencrypt.org/directory certonly -d domaine.tld -d www.domaine.tld -d truc.domaine.tld -d bidule.domaine.tld -d machin.domaine.tld -d etc.domaine.tld
Il installera automatiquement les dépendance manquantes:
Code : Tout sélectionner
Bootstrapping dependencies for Debian-based OSes...
...
Les NOUVEAUX paquets suivants seront installés :
augeas-lenses cpp cpp-4.9 dh-python dialog gcc gcc-4.9 libasan1 libatomic1 libaugeas0 libc-dev-bin libc6-dev libcilkrts5 libcloog-isl4 libexpat1-dev
libffi-dev libgcc-4.9-dev libisl10 libitm1 liblsan0 libmpc3 libmpdec2 libmpfr4 libpython-dev libpython2.7-dev libpython3-stdlib libpython3.4-minimal
libpython3.4-stdlib libssl-dev libtsan0 libubsan0 linux-libc-dev python-chardet-whl python-colorama-whl python-dev python-distlib-whl
python-html5lib-whl python-pip-whl python-pkg-resources python-requests-whl python-setuptools-whl python-six-whl python-urllib3-whl python-virtualenv
python2.7-dev python3 python3-minimal python3-pkg-resources python3-virtualenv python3.4 python3.4-minimal virtualenv zlib1g-dev
...
Et finalement vous créera un joli certificat!
Code : Tout sélectionner
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/domaine.tld/fullchain.pem. Your
cert will expire on 2016-07-18. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
Code : Tout sélectionner
# ls /etc/letsencrypt/live/domaine.tld
cert.pem chain.pem fullchain.pem privkey.pem
Si vous êtes sur APACHE2:
Editez votre VHOST et faites pointer les certificats vers les bons fichiers:
Code : Tout sélectionner
...
<VirtualHost xxx.xxx.xxx.xxx:443>
...
<IfModule mod_ssl.c>
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3
SSLCertificateFile /etc/letsencrypt/live/votredomaine/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/votredomaine/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/votredomaine/fullchain.pem
</IfModule>
Code : Tout sélectionner
/etc/init.d/apache2 force-reload
Donc, il faut modifier le contexte 'server' de votre domaine, pour modifier celui-ci, le mieux étant de le faire dans un fichier de config à part, puis de l'inclure dans votre contexte, tel que 'ssl.cfg' :
Contexte 'server':
Code : Tout sélectionner
include /repertoire_vers_le_fichier_config_ssl/ssl.cfg;
Fichier 'ssl.cfg'
Code : Tout sélectionner
listen 443 ssl spdy;
#listen [::]:443 ssl spdy; # si ipv6 actif, à décommenter !
spdy_headers_comp 9;
ssl on;
Si votre version de nginx est >= 1.9.5, ne plus utiliser les déclarations 'spdy', mais 'http2' !
Ensuite, on va ajouter les autres déclarations liées à l'usage du protocole SSL :
Fichier 'ssl.cfg'
Code : Tout sélectionner
add_header Strict-Transport-Security "max-age=31536000; preload" always;
ssl_certificate /opt/letsencrypt/live/votre_domaine.tld/fullchain.pem;
ssl_certificate_key /opt/letsencrypt/live/votre_domaine.tld/privkey.pem;
ssl_trusted_certificate /opt/letsencrypt/live/votre_domaine.tld/chain.pem;
ssl_dhparam /etc/ssl/private/dhp_4096.pem;
#ssl_ecdh_curve chiffrement_edch_choisi;
ssl_prefer_server_ciphers on;
# Intermediate Mode
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:$
# Modern Mode
#ssl_protocols TLSv1.2;
#ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:EC$
# More secure Mode
#ssl_ciphers 'ECDH:DH:AES:!aNULL:!eNULL:!NULL:!DES:!3DES:!DSS:!EXPORT:!LOW:!MEDIUM:!PSK:!RC4:!SHA';
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
#ssl_session_ticket_key /repertoire_vers_le_fichier_config_ticket_ssl/ticket.key;
ssl_session_timeout 24h;
ssl_stapling on;
ssl_stapling_verify on;
#resolver 127.0.0.1;
# resolvers FDN, OpenNIC
resolver 80.67.169.12 80.67.169.40 142.4.204.111 142.4.205.47 valid=300s;
# resolver ipv6 : FQDN
#resolver 2001:910:800::12 2001:910:800::40 valid=300s;
resolver_timeout 3s;
La première déclaration 'add_header' est lié à l'information HTTP STS qui demande au navigateur web de communiquer uniquement sur le protocole HTTPS, durant la période déclarée. La valeur '31536000' correspond à une année ... valeur qui peut, bien-sûr, être changée !
Les trois autres premières déclarations sont liées aux certificats SSL créés ...
ssl_dhparam: Si vous avez créée votre clé Diffie Hellman, c'est là qu'il faut lui indiquer où elle se trouve ...
Sinon, un petit code shell, tel que, devrait vous servir :
Code : Tout sélectionner
openssl dhparam -rand - 4096 -out "/repertoire_ou_vous_voulez/dh_4096.pem"; chmod 0400 /repertoire_ou_vous_voulez/dh_4096.pem
ssl_ecdh_curve: est le chiffrement ECDHE choisi
- à n'utiliser que si vous avez choisi de créer des clés ECDSA ... ce qui avec le client officiel ne peut pas être le cas, à ce jour ...
ssl_protocols: On bannit tous les anciens modes SSL, pour n'utiliser QUE les modes TLS. C'est un impératif de sécurité !
ssl_ciphers: choisissez en décommentant l'un des modes en question ...
* le mode Intermediate est à utiliser si vous voulez que d'anciens navigateurs web puissent accéder à votre site en HTTPS.
* le mode Modern est à utiliser rien que pour les versions récentes de navigateurs web ...
* le mode "secure" refuse ABSOLUMENT certains chiffrements - c'est à ce jour, le plus sécurisé !
ssl_session_tickets et ssl_session_ticket_key sont à utiliser, si et seulement si, vous désirez l'usage des tickets SSL ... dans ce cas, il faut générer un ticket de chiffrement de session ssl, tel que :
Code : Tout sélectionner
openssl rand 48 > /repertoire_ou_vous_voulez/ticket.key; chmod 0400 /repertoire_ou_vous_voulez/ticket.key
resolver: ce sont les serveurs DNS à interroger !
----
Bon, toutes ces modifications ayant été faites, testez votre config nginx, puis relancez le service !
----
Modifications nginx autres !
Oui, mais moi, je veux rediriger de HTTP, VERS HTTPS !
Pas trop difficile, avant votre déclaration de contexte 'server', il faut en créer une autre, tel que :
Code : Tout sélectionner
server {
listen 80;
listen [::]:80;
server_name votre_nom_domaine;
return 301 https://$host$request_uri;
}
Comme précisé dans le message de félicitation, votre certificat n'est valide que pour 3 mois... Il faut donc tout de suite se couvrir et prévoir le renouvellement.
La solution que j'ai choisi: crontab.
Code : Tout sélectionner
crontab -e
Code : Tout sélectionner
30 1 10 1,3,5,7,9,11 * cd /opt/letsencrypt/ && ./letsencrypt-auto --agree-tos --renew-by-default --standalone --standalone-supported-challenges http-01 --http-01-port 9999 --server https://acme-v01.api.letsencrypt.org/directory certonly -d domaine.tld
Pour un serveur apache2 par exemple:
Code : Tout sélectionner
mv /etc/ssl/certs/domaine.tld.pem /etc/ssl/certs/domaine.tld.pem.bak
mv /etc/ssl/private/domaine.tld.key /etc/ssl/private/domaine.tld.key.bak
ln -s /etc/letsencrypt/live/domaine.tld/fullchain.pem /etc/ssl/certs/domaine.tld.pem
ln -s /etc/letsencrypt/live/domaine.tld/privkey.pem /etc/ssl/private/domaine.tld.key