Cet article décrit les étapes pour configurer un serveur web nginx en HTTPS avec Letsencrypt sous Debian Jessie.
Let’s Encrypt
Let’s Encrypt est une autorité de certification dont le but de faciliter la mise en œuvre d’un certificat X.509 pour le protocole de chiffrement TLS reconnu par tous les navigateurs internet récents. Ce qui permet de chiffrer la connexion bout à bout du serveur au client (visiteur), afin de garantir aucune écoute lors du transfert des pages web entre le serveur et le client.
Je me suis inscrit comme bêta testeur et ma demande fût acceptée :-D
MAJ: tout le monde peut profiter de la bêta public !
Mon serveur Web sous Debian 8
Mon serveur Web est composé comme suit :
En passant entièrement le blog en HTTPS, Varnish ne sera plus utile et je ne ne bénéficierais plus de tous ces avantages (pas grave, le cache nginx est très performant aussi ! ). De plus, dans la configuration actuelle, les pages ne seront plus misent en cache côté navigateur. Bref, beaucoup de désavantage de passer le blog en HTTPS.
Cependant, rien n’est figé dans le temps et je verrais par la suite comment régler tous ces petits problèmes pour retrouver la super performance avant le passage en https :
MAJ : En fait aucun désavantage, peut être un temps de chargement plus long… quoique, nginx configurer avec le protocole HTTP/2 ça va déjà nettement mieux ! :-D
Et pour éviter les timeout de SSLH : sslh choisir le protocole ssl par defaut en cas de timeout
letsencrypt-auto
Pour faciliter la mise en place d’une connexion sécurisé avec un certificat d’autorité reconnu, Let’s Encrypt met à disposition un script qui automatise la démarche : letsencrypt-auto.
La première tache est de cloner Letensctrypt à partir du Gitub :
cd /opt git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt
Stopper tout ce qui gère le serveur web
Dans mon cas : Nginx et SSLH (pour la gestion du port 443) :
systemctl stop nginx && systemctl stop sslh
Création du certificat
./letsencrypt-auto certonly -d memo-linux.com -d www.memo-linux.com -d cdn-01.memo-linux.com -d cdn-02.memo-linux.com --rsa-key-size 4096
Une fois la création terminée, il doit apparaître ce message :
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/memo-linux.com/fullchain.pem. Your cert will expire on 2016-02-10. To obtain a new version of the certificate in the future, simply run Let's Encrypt again.
L’option -d permet d’ajouter les sous domaines.
Ajout des certificats au block server Nginx pour le blog memo-linux.com
- Ajout des certificats :
nano /etc/nginx/site-enabled/memolinux
server { listen 1443; server_name www.memo-linux.com; root /var/www/memo/; index index.php index.html; ###Le chemin de mes certificats Let's Encrypt : ssl_certificate /etc/letsencrypt/live/memo-linux.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/memo-linux.com/privkey.pem; }
idem pour les blocks server des CDN avec la politique de cache :
server { listen 1443 ssl; server_name cdn-01.memo-linux.com; ssl_certificate /etc/nginx/ssl/memolinux/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/memolinux/privkey.pem; location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff)$ { expires max; log_not_found off; } }
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl start nginx && systemctl start sslh
Sécuriser un peu plus le chiffrement
Pour ce faire, il va être créé une clé de chiffrement Diffie-Hellman (pour plus d’info aller voir le site http://wiki.linuxwall.info/ )
- Création de la clé :
openssl dhparam -out /etc/ssl/private/dhparams.pem 4096
nano /etc/nginx/nginx.conf
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_protocols TLSv1.2; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_dhparam /etc/ssl/private/dhparams.pem;
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl start nginx && systemctl start sslh
Test de la méthode du chiffrement avec le certificat Lest’Encrypt
Pour ce faire, se rendre sur le site : https://www.ssllabs.com/ssltest/index.html
Ce qui donne dans mon cas :
Bien joué !
Par contre, le cache navigateur et varnish n’ont pas grand chose à voir…
Merci ! :-D
Du coup, j’ai désinstallé Varnish car il ne me sert plus à rien car pas compatible avec le HTTPS… Pour la cache navigateur, ça ne fonctionne plus et je cherche comment faire : https://gtmetrix.com/reports/memo-linux.com/yK4ZqSIU
Bon, j’étais à côté et pas sur le bon block server pour la gestion des caches…
Il fallait que je rajoute la gestion du cache sur mes blocks server des cdn !
https://gtmetrix.com/reports/memo-linux.com/YyTMgn92
Bonjour et merci pour l’article. J’ai relevé une petite coquille dans une commande :
| ========
Dans mon cas : Nginx et SSLH (pour la gestion du port 443) :
systemctl systemctl stop nginx && systemctl stop sslh
| ========
(Deux fois « systemctl ».)
Merci Simon,
j’ai corrigé la coquille :-)
pour sslh je ferais un petit article pour l’optimiser et éviter les timeout…
Par défaut la clé ne fait pas 4096 bits ? :)
Yep, j’ai mis l’article à jour !
merci @angristan de m’avoir prévenu :-)
En fait, la clé est bien de 2048 bits par défaut… :p
ce qui est déjà pas mal en soit… mais 4096 c’est mieux :razz:
Failed authorization procedure. http://www.quantacloud.ch (tls-sni-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Correct zName not found for TLS SNI challenge. Found ‘mailconfig.ovh.net’, quantacloud.ch (tls-sni-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Correct zName not found for TLS SNI challenge. Found ‘mailconfig.ovh.net’
IMPORTANT NOTES:
– The following ‘urn:acme:error:unauthorized’ errors were reported by
the server:
Domains: quantacloud.ch, http://www.quantacloud.ch
Error: The client lacks sufficient authorization
root@vps234750:/opt/letsencrypt# cmear
-bash: cmear : commande introuvable
root@vps234750:/opt/letsencrypt# clear
J’ai un petit problème x)
t’as configuré ton serveur web avant de créer les certificats ?
tes dommaines sont bien enregistré et pointe bien sur ton serveur ?
(j’ai éssayé ton url et ça pointe chez OVH)
Ah oui, j’avais pas config le serveur web encore x)
Les domaines sont pas encore conf non plus ^^
Je vais refaire ça dans l’ordre x)
Et tu saurais m’aider pour ceci stp :
● apache2.service – LSB: Apache2 web server
Loaded: loaded (/etc/init.d/apache2)
Active: failed (Result: exit-code) since sam. 2016-01-09 09:29:24 CET; 9min ago
janv. 09 09:29:04 vps234750.ovh.net apache2[2155]: Starting web server: apache2(98)Address already in use: AH00072: make_sock: could not bind to ad…[::]:443
janv. 09 09:29:04 vps234750.ovh.net apache2[2155]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
janv. 09 09:29:24 vps234750.ovh.net apache2[2155]: failed!
janv. 09 09:29:24 vps234750.ovh.net apache2[2155]: The apache2 instance did not start within 20 seconds. Please read the log files to discover prob…arning).
janv. 09 09:29:24 vps234750.ovh.net systemd[1]: apache2.service: control process exited, code=exited status=1
janv. 09 09:29:24 vps234750.ovh.net systemd[1]: Failed to start LSB: Apache2 web server.
janv. 09 09:29:24 vps234750.ovh.net systemd[1]: Unit apache2.service entered failed state.
Hint: Some lines were ellipsized, use -l to show in full.
illoxx@vps234750:/etc$
Apache ne peut se lancer car les ports 80 et 443 sont déjà en écoute avec un autre service, que donne un :
[shell]netstat -laputen | grep 80[/shell]
trouvé
changer : Listen 80 > Listen *:80
ok cool !
dans mon cas c’est sur du Nginx, il faut adapter la conf pour Apache :-)
ah non,il recommence…
Tu saurais comment faire stp ? XD
janv. 09 11:29:58 vps234750.ovh.net sudo[11527]: pam_unix(sudo:session): session opened for user root by illoxx(uid=0)
janv. 09 11:29:58 vps234750.ovh.net apache2[11530]: Starting web server: apache2(98)Address already in use: AH00072: make_sock: could not bind to address [::]
janv. 09 11:30:18 vps234750.ovh.net apache2[11530]: failed!
janv. 09 11:30:18 vps234750.ovh.net apache2[11530]: The apache2 instance did not start within 20 seconds. Please read the log files to discover problems … (
janv. 09 11:30:18 vps234750.ovh.net sudo[11527]: pam_unix(sudo:session): session closed for user root
janv. 09 11:30:18 vps234750.ovh.net systemd[1]: apache2.service: control process exited, code=exited status=1
janv. 09 11:30:18 vps234750.ovh.net systemd[1]: Failed to start LSB: Apache2 web server.
— Subject: L’unité (unit) apache2.service a échoué
PS : rien ne tourne sur le port 80 quand Apache est bugué
« Please read the log files to discover problems » que dit les logs ?
essais en root :
[shell]killall -9 apache2[/shell]
puis
[shell]service apache2 start[/shell]
sinon, montre moi tes fichiers de conf (tu colles les confs dans https://framabin.org/ et tu poste le lien ici)
Tout est bon, mais j’ai du mal avec les certificats :
SSLEngine On
SSLCertificateFile « /etc/letsencrypt/live/quantacloud/fullchain »
SSLCertificateKeyFile « /etc/letsencrypt/live/quantacloud/privkey.pem »
SSLProtocol +TLSv1.1 +TLSv1.2 -SSLv3
Tu saurais m’aider stp ?
c’est bon !!!
https://quantacloud.ch x)
Cool :-)
Par contre, tu peux m’aider stp ?
J’ai un gros 403 sur le site :
Protocol http
ServerName quantacloud.ch
Redirect permanent « / » « https://quantacloud.ch/ »
Redirect permanent « /login/ » « https://quantacloud.ch/app/ »
Redirect permanent « /app/ » « https://quantacloud.ch/app/ »
ErrorDocument 404 « 404 : Stay positive, like Proton ! Proton is always optimist ! We love 404 ! »
ServerSignature Off
#Expliciter protocole
Protocol https
DocumentRoot « /home/www/quantacloud/ »
ServerName quantacloud.ch
ServerAlias http://www.quantacloud.ch
UseCanonicalName Off
ServerAdmin quantacloud@protonmail.ch
AddDefaultCharset utf-8
Redirect permanent « / » « /home/ »
AllowOverride None
Require all granted
Options None
RemoveType application/javascript .js
RemoveType application/x-httpd-php .php
DirectoryIndex login.php
AllowOverride FileInfo
Require all granted
Options None
AddType application/javascript .js
AddType application/x-httpd-php .php
AddLanguage fr .fr
#
RewriteEngine On
RewriteRule « ^(.php)$ » « atom?=$1 » [L]
RewriteRule « ^(.*)$ » « atom?=$1 » [QSA,L]
#
DirectoryIndex index.php
AllowOverride FileInfo
Require all granted
Options None
AddType application/javascript .js
AddType application/x-httpd-php .php
AddLanguage fr .fr
RewriteEngine On
RewriteRule « ^(.php) » « atom=$1 » [L]
Salut,
J’ai construit ma clef comme toi, et j’ai a peu près la même configuration nginx que toi.
Mais mon nginx -t me renvoie dans les cordes :
nginx: [emerg] SSL_CTX_use_PrivateKey_file(« /etc/letsencrypt/live/xxxxxxx.xxxxx.xx/cert.pem ») failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: ANY PRIVATE KEY error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)
Est-ce que tu a une idée ou est-ce que tu veut pas m’indiquer ta version (le hash du commit) de letsencrypt
D’après le fichier CHANGES.rst : Release 0.1.0
sinon, je n’ai jamais eu ce problème…
Natir,
Dans la config de nginx, la ligne SSL_certificate_key doit pointer vers privkey.pem et pas vers cert.pem.
Est-ce que ce serait pas ça le soucis ?