Aller au contenu principal

Certificat SSL

Présentation​

Documentation pour la mise en place de certificat SSL pour votre serveur disposant de Haproxy, si vous n'avez pas de reverse proxy il faut passer par la doc https://doc.kokiris.com/Apache#lets-encrypt

Haproxy est en charge de

  • la terminaison SSL ;
  • du HTTP/2 ;
  • de la sécurité des connexions ;
  • du routage évolué.
RôleRépartiteur de charge
Gestion des certificatsLet’s Encrypt ou certificats payants via haple.sh, synchronisés sur architecture Multi
Privilège super-utilisateurreload/restart via synchroGS

Certificat payant​

Un certificat payant (Sectigo, etc.) s’installe avec l’option loadcertificate. Le script assemble le fichier attendu par Haproxy, vérifie que le certificat et la clé privée sont lisibles et concordants, puis recharge Haproxy.

Prérequis :

  • le domaine doit être résolu dans le DNS ;
  • les fichiers doivent appartenir à l’utilisateur admin{custcode} et ne pas être des liens symboliques ;
  • les permissions doivent être restreintes, par exemple chmod 600 *.key *.crt.

Les arguments sont, dans l’ordre : le nom de domaine, la clé privée, le certificat, puis le certificat intermédiaire (facultatif).

sudo /usr/local/bin/haple.sh loadcertificate mondomaine.org /home/admin{custcode}/ssl/mondomaine.org.key /home/admin{custcode}/ssl/mondomaine.org.crt /home/admin{custcode}/ssl/mondomaine.org-intermediate.crt
attention

Ne déposez pas de fichier directement dans /home/admin{custcode}/ssl/hap/ : son contenu ne serait pas vérifié et Haproxy ne serait pas rechargé.

Gratuit avec Let’s encrypt​

Avant exécution du script ci-dessous, il est impératif de vérifier que le domaine pointe bien sur l’adresse ip serveur ou bien celle du loadbalancer.

Règles​

Limitation

Rechercher

Création avec haple.sh​

!!! Attention !!! par robustesse, choisissez de multiplier les certificats plutôt que d’ajouter pleins de domaines à un seul et unique certificat, car en cas d’anomalie de renouvellement sur un des domaines, le certificat entier ne serait pas renouvelé.

Exemple de création d’un certificat avec le script /usr/local/bin/haple.sh par l’utilisateur admin :

sudo /usr/local/bin/haple.sh create email@mondomaine.com www.mondomaine.org

Création avec haple.sh et challenge DNS​

attention

Si votre version du script haple.sh ne propose pas l’option correspondant à votre fournisseur (create-cert-dns-ovh, create-cert-dns-gandi, create-cert-dns-ionos ou create-cert-dns-cloudflare), contactez le support à l'adresse support@kokiris.com. Nous mettrons alors le script à jour et installerons les modules nécessaires.

Le challenge DNS utilise l’API de votre fournisseur DNS. Les identifiants de l’API sont lus dans un fichier .ini propre à chaque fournisseur, placé dans /home/admin{custcode}/ssl/ (le chemin exact est indiqué pour chaque fournisseur ci-dessous). Ce fichier doit :

  • être créé en étant connecté avec l’utilisateur admin{custcode}, sans sudo, pour qu’il lui appartienne ;
  • ne pas être un lien symbolique ;
  • être protégé en lecture avec chmod 600.

OVH​

Tout d'abord, créez le jeton d'API OVH via ce lien : https://www.ovh.com/auth/api/createToken et renseignez les informations suivantes :

Une fois les informations de connexion de l'API créées, créez le fichier /home/admin{custcode}/ssl/.ovh.ini avec le contenu ci-dessous, puis restreignez ses droits :

nano /home/admin{custcode}/ssl/.ovh.ini
/home/admin{custcode}/ssl/.ovh.ini
dns_ovh_endpoint = ovh-eu
dns_ovh_application_key = xxxxxxxxxxxx
dns_ovh_application_secret = xxxxxxxxxxxx
dns_ovh_consumer_key = xxxxxxxxxxxx
chmod 600 /home/admin{custcode}/ssl/.ovh.ini

Voici la commande permettant de créer le certificat avec le challenge DNS d'OVH :

sudo /usr/local/bin/haple.sh create-cert-dns-ovh email@mondomaine.com www.mondomaine.org

Gandi​

Créez un jeton d’accès personnel (Personal Access Token) autorisé à gérer la configuration technique des domaines, puis créez le fichier /home/admin{custcode}/ssl/.gandi.ini avec le contenu ci-dessous et restreignez ses droits :

nano /home/admin{custcode}/ssl/.gandi.ini
/home/admin{custcode}/ssl/.gandi.ini
dns_gandi_token = PERSONAL_ACCESS_TOKEN
# facultatif : identifiant d'organisation, à supprimer si inutilisé
dns_gandi_sharing_id = SHARINGID
chmod 600 /home/admin{custcode}/ssl/.gandi.ini

Voici la commande permettant de créer le certificat avec le challenge DNS Gandi :

sudo /usr/local/bin/haple.sh create-cert-dns-gandi email@mondomaine.com www.mondomaine.org

IONOS​

Créez une clé d’API sur https://developer.hosting.ionos.com/keys. Elle se compose d’un préfixe et d’un secret. Créez ensuite le fichier /home/admin{custcode}/ssl/.ionos.ini avec le contenu ci-dessous, puis restreignez ses droits :

nano /home/admin{custcode}/ssl/.ionos.ini
/home/admin{custcode}/ssl/.ionos.ini
dns_ionos_prefix = myapikeyprefix
dns_ionos_secret = verysecureapikeysecret
dns_ionos_endpoint = https://api.hosting.ionos.com
chmod 600 /home/admin{custcode}/ssl/.ionos.ini

Voici la commande permettant de créer le certificat avec le challenge DNS IONOS :

sudo /usr/local/bin/haple.sh create-cert-dns-ionos email@mondomaine.com www.mondomaine.org

Cloudflare​

Créez un jeton d’API sur https://dash.cloudflare.com/profile/api-tokens avec la permission Zone / DNS / Edit sur la zone concernée, puis créez le fichier /home/admin{custcode}/ssl/.cloudflare.ini avec le contenu ci-dessous et restreignez ses droits :

nano /home/admin{custcode}/ssl/.cloudflare.ini
/home/admin{custcode}/ssl/.cloudflare.ini
dns_cloudflare_api_token = apikey
chmod 600 /home/admin{custcode}/ssl/.cloudflare.ini

Voici la commande permettant de créer le certificat avec le challenge DNS Cloudflare :

sudo /usr/local/bin/haple.sh create-cert-dns-cloudflare email@mondomaine.com www.mondomaine.org

Certificat wildcard​

Un certificat wildcard (*.mondomaine.com) ne peut être obtenu qu’avec un challenge DNS. Le nom doit être placé entre guillemets simples pour ne pas être interprété par le shell :

sudo /usr/local/bin/haple.sh create-cert-dns-ovh email@mondomaine.com '*.mondomaine.com'

Un certificat wildcard ne couvre pas le domaine nu mondomaine.com, qui nécessite un certificat distinct.

Le certificat est enregistré sous le nom mondomaine.com, sans le préfixe *. : utilisez ce nom avec les options show, delete et revoke.

Tester sans risque de blocage la création de certificat avec haple.sh​

Let's Encrypt limite le nombre d’échecs de validation : au-delà de 5 échecs par nom de domaine en une heure, les nouvelles tentatives sont refusées, puis une nouvelle tentative est de nouveau autorisée toutes les 12 minutes. D'autres limitations s’appliquent.

Pour tester la validité de son domaine sans avoir à risquer de se faire bloquer, il est possible d'utiliser l'argument test suivi du nom de domaine. Ce test porte sur la création avec create (challenge HTTP) :

sudo /usr/local/bin/haple.sh test mondomaine.com

Pour vérifier uniquement que le domaine est résolu dans le DNS (aucune sortie si c’est le cas) :

sudo /usr/local/bin/haple.sh checkdns mondomaine.com

Renouvellement avec haple.sh​

Le renouvellement est automatique : une tâche planifiée installée sur le serveur (le serveur maître en architecture Multi) exécute haple.sh renew une fois par semaine. Seuls les certificats Let’s Encrypt arrivant à moins de 30 jours de leur expiration sont renouvelés. Aucune action de votre part n’est nécessaire.

Si vous aviez ajouté cette commande dans votre crontab, vous pouvez la retirer.

Pour lancer un renouvellement manuellement :

sudo /usr/local/bin/haple.sh renew

Consultation des certificats​

Lister les certificats Let’s Encrypt installés, avec leur date d’expiration :

sudo /usr/local/bin/haple.sh list

Afficher le fichier installé pour un domaine. Attention, ce fichier contient la clé privée :

sudo /usr/local/bin/haple.sh show mondomaine.com

Suppression de certificat​

Le premier argument indique le type de certificat : le pour un certificat Let’s Encrypt, custom pour un certificat payant installé avec loadcertificate. Le certificat est retiré de Haproxy, qui est rechargé et synchronisé avec le slave.

sudo /usr/local/bin/haple.sh delete le mondomaine.com
sudo /usr/local/bin/haple.sh delete custom mondomaine.com

Révocation de certificat​

La révocation est à réserver au cas où la clé privée d’un certificat Let’s Encrypt a été compromise :

sudo /usr/local/bin/haple.sh revoke mondomaine.com

Vidéo démo​

Voici une démonstration mettant en avant l'usage du script haple.sh :