27

configurer nginx en https avec Let’s Encrypt sous Debian Jessie

Cet article décrit les étapes pour configurer un serveur web nginx en HTTPS avec Letsencrypt sous Debian Jessie.

httpsmemolinuxletsencrypt

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 :

  • Nginx : port 8080 et 1443
  • Varnish : port 80
  • Php-FPM : port 9000
  • HHVM : port 9001
  • SSLH : port 443

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 :

memolinuxgradeA

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;
            }
      }
    
  • Test de la configuration :
  • nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
  • Relance des services :
  • systemctl start nginx && systemctl start sslh
  • test de l’url : https://memo-linux.com
  • httpsmemolinux

    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
  • Modification du fichier de configuration de Nginx :
  • 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;
    
  • Test de la configuration :
  • nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
  • Relance du serveur web nginx :
  • 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 :
memolinuxssllabsreportsAAA

Partager l'article :





fred

"Dire que l'on s'en fiche du droit à la vie privée sous prétexte qu'on a rien à cacher, c'est comme déclarer que l'on se fiche du droit à la liberté d'expression sous prétexte qu'on a rien à dire." Edward Snowden

27 commentaires

  1. Bien joué !
    Par contre, le cache navigateur et varnish n’ont pas grand chose à voir…

  2. 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 ».)

  3. Merci Simon,
    j’ai corrigé la coquille :-)
    pour sslh je ferais un petit article pour l’optimiser et éviter les timeout…

  4. Yep, j’ai mis l’article à jour !
    merci @angristan de m’avoir prévenu :-)

  5. ce qui est déjà pas mal en soit… mais 4096 c’est mieux :razz:

  6. 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)

  7. 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)

  8. 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$

  9. 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]

  10. ok cool !
    dans mon cas c’est sur du Nginx, il faut adapter la conf pour Apache :-)

  11. 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é

  12. PS : rien ne tourne sur le port 80 quand Apache est bugué

  13. « 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)

  14. 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 ?

  15. 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]

  16. 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

  17. D’après le fichier CHANGES.rst : Release 0.1.0
    sinon, je n’ai jamais eu ce problème…

  18. 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 ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.