SSL

Plus d’infos sur SSL


Créer un certificat SSL

Non signé par une CA: avec OpenSSL

Commencer par un certificat auto-signé ou signé par une CA perso est une bonne manière de vérifier les configurations du serveur web avant d’essayer d’obtenir un certificat d’une autorité de certification reconnue pour un nom de domaine publique.

Fichier de configuration

Signé par une CA perso: avec OpenSSL

Le certificat auto-signé peut être considéré comme une autorité de certification:

  1. Créer un certificat auto-signé — ce sera notre CA

     # Organization: Local
     # Common Name: MyProjectName
     openssl req -x509 \
         -nodes -sha256 -newkey rsa:2048 \
         -keyout CertificateAuthority.key \
         -out CertificateAuthority.crt \
         -days 1825
    
  2. Importer ce certificat (CertificateAuthority.crt) dans le navigateur web.
    Pour ne pas recevoir de warning de la part du navigateur, il faut faire confience à l’Autorité de Certification qui a signé le certificat. Les navigateurs Web comme Firefox, Chromium, Google Chrome, Vivaldi et même les clients de messagerie comme Mozilla Thunderbird n’utilisent pas le Trust Store de l’OS, mais utilisent leur propre Trust Store.

    • Firefox: Preferences/Privacy & Security/View Certificates/Authorities
    • Chrome: Settings/Advanced/Privacy and Security/Manage certificates/Authorities
    • Linux OS
    • Windows OS: double-cliquer sur CertificateAuthority.crt > “Installer Certificat”
  3. Créer une clé privée + CSR (Certificate Signing Request):

     openssl req \
         -nodes -sha256 -newkey rsa:2048 \
         -keyout Server.key \
         -out Server.csr
    
  4. Préparer les infos du certificat demandé

     cat <<'NOWDOC' > v3.ext
     authorityKeyIdentifier=keyid,issuer
     basicConstraints=CA:FALSE
     keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
     subjectAltName = @alt_names
    
     [alt_names]
     DNS.1 = myprojectname.fr
     DNS.2 = *.myprojectname.fr
     NOWDOC
    
  5. Créer le certificat avec la CA:

     openssl x509 -req \
         -sha256 -extfile v3.ext \
         -in Server.csr \
         -CA CertificateAuthority.crt \
         -CAkey CertificateAuthority.key \
         -CAcreateserial \
         -out Server.crt \
         -days 365
    

OpenSSL Command Cheatsheet

Signé par LetsEncrypt: avec Certbot

Certbot est un utilitaire de Let’s Encrypt, qui permet d’obtenir un certificat SSL d’une autorité de certification reconnue, gratuitement.

Version nginx

Version apache

sudo certbot --apache -d www.monsite.com

certbot posera un certain nombre de questions, lancera le défit pour valider le nom de domaine, mettra à jour la configuration d’Apache et le redémarrera.

Configurer le renouvellement automatique

Les certificats délivrés par Letsencrypt sont valables 90 jours. Certbot installe une tâche cron pour renouveler automatiquement les certificats sur le point d’expirer (dans moins de 30 jours).

  1. Vérifier que le processus de renouvellement fonctionne — s’il n’y a pas d’erreur, c’est qu’il a fonctionné:

     certbot renew --dry-run
    
  2. Vérifier que le cronjob est planifié:

     ls /etc/cron.d/certbot
    
  3. Créer un script sighup qui recharge les configurations du front à la demande — pour que le front serve le nouveau certificat SSL et non pas l’ancien après que le certificat SSL ait été renouvelé. (Ici, envoit un sighup au container nommé “front”, qui gère le front)

       cat /home/deployer/bin/docker_sighup_front.sh
    
       #!/bin/bash
       set -e
    
       #----------------------------------------------------
       # Sends a SIGHUP signal
       # to the front container (if running)
       #
       # This will reload nginx, so that nginx uses
       # the new .conf file & SSL certificate
       #----------------------------------------------------
    
       if [[ $(docker ps -q -f name=front) ]]; then
           echo "Reloading..."
           docker kill --signal=SIGHUP front
       else
           echo "Nothing to do!"
       fi
    

    Rendre le script executable

       chmod +x !$
    

    Vérifier qu’il fonctionne correctement

       /home/deployer/bin/docker_sighup_front.sh
    
  4. Ajouter un hook à la fin du fichier /etc/letsencrypt/cli.ini:

     # Global config for letsencrypt runs
     #
     # Note that these options apply automatically to all use of Certbot for
     # obtaining or renewing certificates, so options specific to a single
     # certificate on a system with several certificates should not be placed
     # here.
    
     deploy-hook = /home/deployer/bin/docker_sighup_front.sh
    

    Ou si on n’utilise pas de container, on peut directement mettre:

     deploy-hook = service nginx reload
    
  5. Forcer le renouvellement du certificat SSL

     certbot renew --force-renewal
    
  6. Vérifier dans le navigateur que le certificat a été mis à jour

Pour plus d’infos sur les hooks certbot disponibles: certbot --help renew

Sur un Droplet DigitalOcean

Générer un certificat SSL wildcard avec Let’s Encrypt


Contenu d’un certificat


PKCS#1 vs #8


Activer SSL sur un serveur web

Apache

Nginx

Source: NGINX config for SSL with Let’s Encrypt certs