Automatiser le SSL Let's Encrypt sur un Application Load Balancer AWS
Dans cet article, vous pouvez automatiser toutes les operations d'emission Let's Encrypt pour l'Application Load Balancer AWS et apprendre comment gerer le...

La plupart du temps, nous n'avons besoin de rien d'autre que d'AWS Certificate Manager (ACM) mais dans certains cas, si vous hebergez le domaine de votre client avec un ALB et que vous n'avez pas la possibilite d'obtenir un certificat SSL aupres de votre client, vous devez trouver une solution de contournement. Dans cet article, nous allons emettre un SSL Let's Encrypt sur un Application Load Balancer AWS et l'automatiser !
Lorsque vous demandez un certificat SSL a Let's Encrypt, LE dispose de plusieurs methodes de verification telles que web-challenge, route53, etc. Dans ce scenario, j'ai decide d'utiliser web-challenge car la gestion DNS des domaines ne m'appartient pas. J'heberge simplement l'application et j'ai besoin d'emettre un SSL.
Lorsque vous demandez un SSL avec web-challenge, Let's Encrypt verifie le chemin https://domain.com/.well-known/acme-challenge pour s'assurer et verifier. Qu'est-ce que cela signifie ? Cela signifie que Let's Encrypt enverra une requete au domaine sur le port 80 et effectuera la verification. Hmm, nous devons faire quelques ajustements sur la configuration de notre Load Balancer et avons besoin d'un autre Target Group pour rediriger les requetes acme-challenge specifiquement.
Etape 1 : Lancer une nouvelle EC2 et Creer un Nouveau Target Group
Cloner le Depot
J'ai ecrit un script bash pour une gestion facile et pour garder les standards de la meme maniere pour chaque domaine. Vous pouvez consulter mon depot GitHub ou cloner le depot sous le chemin /opt/ dans acme-challange-server
Astuce : # git clone https://github.com/flightlesstux/alble.git
Installer nginx, Let's Encrypt et les configurer
Lorsque nous recevons une requete /.well-known/acme-challenge/*, l'EC2 avec nginx installe gerera toutes les requetes acme-challenge et emettra un SSL pour nous.
Installer nginx et configurer pour /.well-known/acme-challenge/
Vous pouvez facilement installer nginx avec la commande amazon-linux-extras install nginx1. Apres l'installation, vous devez ajouter un nouveau bloc location dans le fichier de configuration racine de nginx. Le fichier de configuration racine se trouve dans /etc/nginx/nginx.conf
location /.well-known/acme-challenge {
root /opt/alble/certbot-challange;
}La valeur server_name doit etre _; pour tous les domaines. Nous ne pouvons pas definir un nom DNS statique.
Installer Certbot avec le module nginx
Tout d'abord, nous allons installer certbot depuis le depot epel et nous devons installer epel d'abord. Pour l'installation d'epel, vous pouvez utiliser la commande amazon-linux-extras install -y epel puis lancer yum install -y nginx certbot python2-certbot-nginx jq dig pour couvrir les prerequis.
Politique IAM Role pour le Serveur acme-challenge
Le serveur acme-challenge dispose d'un IAM Role pour acceder aux operations ACM et ALB avec les SSL Let's Encrypt. Vous pouvez voir la politique IAM ci-dessous.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSLEPolicy1",
"Effect": "Allow",
"Action": [
"acm:DescribeCertificate",
"acm:RemoveTagsFromCertificate",
"acm:GetCertificate",
"acm:AddTagsToCertificate",
"acm:ListCertificates",
"acm:ImportCertificate",
"acm:ListTagsForCertificate"
],
"Resource": "*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "acme-challenge-server-Elastic-IP/32"
}
}
},
{
"Sid": "AWSLEPolicy2",
"Effect": "Allow",
"Action": [
"elasticloadbalancing:RemoveTags",
"elasticloadbalancing:DescribeTags",
"elasticloadbalancing:AddTags",
"elasticloadbalancing:AddListenerCertificates"
],
"Resource": "AWS::ALB::ARN",
"Condition": {
"IpAddress": {
"aws:SourceIp": "acme-challenge-server-Elastic-IP/32"
}
}
},
{
"Sid": "AWSLEPolicy3",
"Effect": "Allow",
"Action": [
"elasticloadbalancing:DescribeSSLPolicies",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:DescribeListenerCertificates"
],
"Resource": "*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "acme-challenge-server-Elastic-IP/32"
}
}
},
{
"Sid": "AWSLEPolicy4",
"Effect": "Allow",
"Action": [
"elasticloadbalancing:RemoveTags",
"elasticloadbalancing:DescribeTags",
"elasticloadbalancing:AddTags"
],
"Resource": "AWS::ALB::ARN",
"Condition": {
"IpAddress": {
"aws:SourceIp": "acme-challenge-server-Elastic-IP/32"
}
}
},
{
"Sid": "AWSLEPolicy5",
"Effect": "Allow",
"Action": [
"elasticloadbalancing:DescribeSSLPolicies",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:AddListenerCertificates",
"elasticloadbalancing:DescribeListenerCertificates"
],
"Resource": "*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "acme-challenge-server-Elastic-IP/32"
}
}
}
]
}Vous pouvez attacher cette politique directement au serveur acme-challenge sans probleme de securite ni fuite apres lui avoir attribue une Elastic IP. Si vous voulez utiliser des identifiants locaux, vous pouvez egalement utiliser la meme politique IAM.
Creer un Nouveau Target Group
Apres la configuration de l'instance EC2, j'ai cree un Target Group nomme acme-challenge et je redirige les requetes vers l'EC2 avec nginx installe nommee acme-challange-server et j'enregistre notre acme-challenge-server comme cible. Si tout se passe sans probleme, votre ecran ressemblera a ceci.

Etape 2 : Creer une Regle d'Ecoute sur l'Application Load Balancer
Nous devons editer et creer une nouvelle regle d'ecoute pour accepter et rediriger les requetes /.well-known/acme-challenge/* vers le Target Group acme-challenge. Une fois cette etape terminee, votre ecran ressemblera a ceci.

Maintenant, nous sommes prets a demander un SSL Let's Encrypt aupres d'ACME et a l'emettre sans probleme, l'importer dans ACM et l'assigner a l'ALB AWS : ) Cette operation contient trois etapes differentes pour l'emission.
- Demander un SSL a Let's Encrypt
- Importer le SSL demande si le domaine ou sous-domaine correspond a l'enregistrement CNAME de l'ALB AWS
- Assigner le certificat SSL importe a l'ALB AWS pour utilisation en production
Emettons et Demandons un SSL Let's Encrypt aupres d'ACME
Lorsque vous clonez le depot git, vous devez deplacer le dossier /opt/alble/renewal-hooks sous le chemin /etc/letsencrypt/. Sinon, vous ne pourrez pas renouveler le certificat sur ACM et la securite de vos clients sera compromise. Vous pouvez copier et coller mv /opt/alble/renewal-hooks /etc/letsencrypt/
Lisez simplement le fichier README.md sur le depot git et ecrivez vos variables dans le fichier env. Apres cela, vous pouvez facilement executer/gerer/creer les certificats SSL Let's Encrypt sur l'Application Load Balancer AWS. Je recommande d'utiliser AWS SSM pour executer la commande sur acme-challange-server pour emettre un SSL. Pour cela, vous devez ajouter la politique a votre IAM Role.
AmazonEC2RoleforSSM
J'ai decide d'utiliser un sous-domaine pour les tests mais cela n'a pas d'importance. Vous pouvez egalement utiliser un domaine racine. Mes domaines de test sont awsle-1.ercanermis.com et awsle-2.ercanermis.com
Lorsque vous etes dans le chemin /opt/alble/, vous pouvez lancer la commande comme ./create-new-site.sh awsle-1.ercanermis.com et vous verrez la sortie ci-dessous.

Mon script ALBLe verifie d'abord l'enregistrement CNAME du domaine et/ou sous-domaine et s'assure avant de continuer. Si vous ecrivez un mauvais domaine/sous-domaine ou faites une faute de frappe, il vous avertira via des alertes Slack. Les alertes sont vraiment importantes pour l'automatisation. Vous pouvez configurer les alertes Slack dans le fichier env. Voici l'exemple si vous emettez le SSL Let's Encrypt deja emis auparavant :

Production
Le nom DNS de mon ALB AWS est web-application-elb-1302305711.us-east-1.elb.amazonaws.com et je peux y acceder via https://web-app.ercanermis.com Il utilise AWS Certificate Manager pour obtenir un SSL.
Mes domaines de test sont https://awsle-1.ercanermis.com et https://awsle-2.ercanermis.com et ils utilisent Let's Encrypt avec l'Application Load Balancer AWS, oui ! : )



A quoi ressemblent les certificats SSL de l'ALB AWS et ACM ?


J'espere que cet article vous aidera ! P.S. N'oubliez pas de configurer un cron pour les demandes de renouvellement.
Code source : https://github.com/flightlesstux/alble/
Plus d'Ercan
Deux autres sites, même auteur, terrain différent.
IA, LLMs, agents, ML appliquée.
Notes de terrain sur les charges IA. Analyse des coûts Bedrock, patterns d'agents, compromis de stockage vectoriel, modes de défaillance en production.
Visiter ercan.ai →Le hub. À propos, conseil, contact.
Hub personnel pour les deux pistes d'écriture. Qui je suis, comment fonctionne le conseil, comment me joindre.
Visiter ercanermis.com →