Mise en place d'un certificat ssl avec nginx et configuration

Def :

Une certificat ssl est fichier de configuration liant une clé cryptographique à une organisation ou un individus.
Un certificat ssl peut être signé par :

Le problème avec les certificat auto-signé c'est qu'ils provoquent une alerte lorsque vous tentez d'allez sur le site web.

  • Pourquoi ?

  • Parce que rien ne garantie que le la clé de chiffrement est valable ou que le certificat contient des informations erroné ou moifier volontairement afin de commetre des actes non recommendé.
    En d'autre termes, le certificat dit au navigateur que le site est sécurisé et que la sécurité n'est pas factice.

    Pour commencer ptit mise à jour en root

      apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y #Et un ptit reboot si necéssaire

    On télécharge Letsencrypt qui est une autorité de certification gratuite.

      git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt --depth=1

    #Si vous ne disposez pas de git "apt-get install git"
    #--depth=1 c'est pour ne pas récupere tout l'historique de git, on met letsencrypt dans le répertoir opt.

      cd /opt/letsencrypt

    Dans /etc/nginx/sites-enabled/default On configure le server nginx pour que letsencrypt puisse avoir acces au fichier dont il a besoin pour faire la verification

      server {
        listen 80;
        listen [::]:80;
        server_name nom_de_domaine/ip;
        #nginx repond avec ce server uniquement lorsque nom_de_domaine est demandé
        #(vous pouvez faire plusieur server ducoup).

        location ~ /\.well-known/acme-challenge {
          allow all;
          root /var/www/pi-univers;
        }
        location / {
          return 301 https://nom_de_domaine;

        }
      }

    On crée un certificat avec une clé de 4096 bits, vous pouvez reduire celle-ci si vous souhaiter accéler les échanges entre le server et le client au détriment de la sécurité.
    Le certificat et la clé privé seront stoké dans /etc/letsencrypt/live/ton_nom_de_domaine et de toute façon le prog te le dis à la fin.

      /opt/letsencrypt/letsencrypt-auto certonly --rsa-key-size 4096 --webroot --webroot-path /var/www/html -d mondomaine.fr


    Maintenant il va falloir configurer nginx pour qu'il sache où se situe la clé privé et le certificat et pour que lorsque que le va sur ton site, on soit directement rediriger vers le port 443 qui est le port dédié au https.
    C'est pourquoi nous allons créé 2 serveur (1er :: 443 et 2ème :: 80)
    Pour la redirection, 1er serveur:

    Pour la configuration ssl, 2ème serveur :
    Vous pouvez garder l'ancienne configuration mais on va juste rajouter quelque lignes et en modifier certaines.

    Remplacer :

      listen 80;      -->  listen 443 ssl (http2; si nginx>1.9.5 sinon spdy;)
      listen [::]:80; -->  listen [::]:443 ssl #http2; si nginx>1.9.5 sinon spdy;

    Et enfin ajouter où vous voullez dans server {...} :

      #SSL
      ssl on;
      ssl_certificate /etc/letsencrypt/live/pi-univers.ml/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/pi-univers.ml/privkey.pem;
      ssl_protocols TLSv1.3 TLSv1.2;
      ssl_ecdh_curve X25519:secp384r1;
      ssl_prefer_server_ciphers on;
      ssl_ciphers TLS13+AESGCM+AES128:EECDH+AESGCM:EECDH+CHACHA20
      #ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL
      ssl_session_timeout 1d;
      ssl_session_cache shared:SSL:50m;
      ssl_session_tickets off;

    #TLS est la version ultérieur de SSL, c'est un protocole de sécurisation des échanges.
    certificat : on dit au ce situe le certificat ssl.
    certificat_key : on indique la position de la clé.
    portocols : on indique le(s) protocol(s) à utilisé(s).
    prefer_server_ciphers on : on indique au navigateur que l'on prefère utiliser les types de chiffrements proposé par le serveur.
    session_timout : La durée au bout de la quelle

    Configuration de l'en tête :

      add_header Strict-Transport-Security "max-age=31536000; pi-univers.ml; preload";
      add_header X-Frame-Options DENY;
      add_header X-Content-Type-Options nosniff;
      add_header X-XSS-Protection "1; mode=block";

    Il n'y a plus qu'a tester si la config est ok.

      nginx -t

    Puis redemarer nginx mais notre cas c'est le démarré puisqu'on l'avait arreté pour letsencrypt

      service nginx start #Ou restart dans le cas ou il déjà démarré

    Rien qu'avec cette configuration, on peut obtenir la note de B sur SSL Server Labs qui permet de tester le niveau de sécurité de votre configuration ssl.

    Si vous le voullez, vous pouvez encore plus le sécurisez en générant une clé dhparam, elle est utilisé pour chiffré la clé qui sera utilisé pour chiffré la page ou une conversation etc.

      mkdir /etc/nginx/ssl
      openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

    Ca risque de prendre un certains temps (40 min voir plus mais ça vaut le coup !)
    Pour indiquer à nginx ou se trouve la clé dhparam :

      ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    Et maintenant c'est si vraiment tu veux obtenir la note A+, il faut activer HSTS qui est politique de sécurité pour http, en gros le server dit au navigateur qu'il doit intéragir avec lui entièrement de manière sécurisé (https)
    Dans notre cas c'est six mois (max-age=31536000(1 ans)).

      add_header Strict-Transport-Security "max-age=31536000; nom_de_domaine; preload";



    Commande pour renouveler le certificat letsencrypt :

      service nginx stop #Ou service apache stop, si votre server est apache
      cd /opt/letsencrypt
      ./certbot-auto renew
      service nginx start

    Voilà vous venez installer un certificat ssl super bien et configurer nginx comme un dieu.