Αυτοματοποίηση Let's Encrypt SSL σε AWS Application Load Balancer
Σε αυτό το άρθρο, μπορείς να αυτοματοποιήσεις όλες τις διαδικασίες έκδοσης Let's Encrypt για AWS Application Load Balancer και να μάθεις πώς...

Τις περισσότερες φορές, δεν χρειαζόμαστε τίποτα εκτός από το AWS Certificate Manager (ACM), αλλά σε ορισμένες περιπτώσεις, αν φιλοξενείς το domain του πελάτη σου με ALB και δεν έχεις τη δυνατότητα να πάρεις SSL certificate από τον πελάτη σου, πρέπει να κάνεις κάποιο workaround. Σε αυτό το άρθρο, θα εκδώσουμε ένα Let's Encrypt SSL σε AWS Application Load Balancer και θα το αυτοματοποιήσουμε!
Όταν ζητάς ένα SSL certificate από το Let's Encrypt, το LE έχει κάποιες μεθόδους επαλήθευσης όπως web-challenge, route53, κλπ. Σε αυτό το σενάριο, αποφάσισα να χρησιμοποιήσω το web-challenge επειδή η διαχείριση DNS των domains δεν είναι δική μου. Απλά φιλοξενώ την εφαρμογή και χρειάζομαι να εκδώσω ένα SSL.
Όταν ζητάς SSL με web-challenge, το Let's Encrypt ελέγχει το path https://domain.com/.well-known/acme-challenge για να βεβαιωθεί και να επαληθεύσει. Τι σημαίνει αυτό; Σημαίνει ότι το Let's Encrypt θα στείλει ένα request στο domain στη θύρα 80 και θα κάνει επαλήθευση. Χμμ, πρέπει να κάνουμε κάποιες προσαρμογές στη διαμόρφωση του Load Balancer μας και χρειαζόμαστε άλλο Target Group για να ανακατευθύνουμε τα acme-challenge requests συγκεκριμένα.
Βήμα 1: Εκκίνησε ένα νέο EC2 και Δημιούργησε ένα Νέο Target Group
Κάνε Clone το Repository
Έγραψα ένα bash script για εύκολη διαχείριση και για να διατηρώ τα standards με τον ίδιο τρόπο για κάθε domain. Μπορείς να δεις το GitHub repository μου ή να κάνεις clone το repository κάτω από το path /opt/ στον φάκελο acme-challange-server
Συμβουλή: # git clone https://github.com/flightlesstux/alble.git
Εγκατάστησε nginx, Let's Encrypt και διαμόρφωσέ τα
Όταν λαμβάνουμε ένα request /.well-known/acme-challenge/*, το EC2 με εγκατεστημένο nginx θα διαχειριστεί όλα τα acme-challenge requests και θα εκδώσει ένα SSL για εμάς.
Εγκατάστησε nginx και διαμόρφωσέ το για /.well-known/acme-challenge/
Μπορείς εύκολα να εγκαταστήσεις το nginx με την εντολή amazon-linux-extras install nginx1. Μετά την εγκατάσταση, πρέπει να προσθέσεις ένα νέο location block στο root config του nginx. Το root config file βρίσκεται στο /etc/nginx/nginx.conf
location /.well-known/acme-challenge {
root /opt/alble/certbot-challange;
}Η τιμή του server_name πρέπει να είναι _; για όλα τα domains. Δεν μπορούμε να ορίσουμε ένα στατικό DNS name.
Εγκατάστησε το Certbot με το nginx module
Πρώτα απ' όλα, θα εγκαταστήσουμε το certbot από το epel repository και πρέπει να εγκαταστήσουμε πρώτα το epel. Για την εγκατάσταση του epel, μπορείς να χρησιμοποιήσεις την εντολή amazon-linux-extras install -y epel και μετά απλά τρέξε yum install -y nginx certbot python2-certbot-nginx jq dig για να καλύψεις τις προαπαιτήσεις.
IAM Role Policy για τον acme-challenge Server
Αυτός ο acme-challenge server έχει ένα IAM Role για πρόσβαση σε λειτουργίες ACM και ALB με Let's Encrypt SSLs. Μπορείς να δεις το IAM Policy παρακάτω.
{
"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"
}
}
}
]
}Μπορείς να συνδέσεις αυτό το policy απευθείας στον acme-challenge server χωρίς κανένα θέμα ασφάλειας και διαρροή αφού του αναθέσεις ένα Elastic IP. Αν θέλεις να χρησιμοποιήσεις τοπικά credentials, μπορείς επίσης να χρησιμοποιήσεις το ίδιο IAM Policy.
Δημιούργησε ένα Νέο Target Group
Μετά τη διαμόρφωση του EC2 instance, δημιούργησα ένα Target Group με όνομα acme-challenge και ανακατευθύνω το request στο EC2 με εγκατεστημένο nginx που ονομάζεται acme-challange-server και καταχωρώ τον acme-challenge-server μας ως target. Αν όλα πάνε χωρίς πρόβλημα, η οθόνη σου θα μοιάζει με την παρακάτω.

Βήμα 2: Δημιούργησε έναν Application Load Balancer Listener Rule
Πρέπει να επεξεργαστούμε και να δημιουργήσουμε ένα νέο listener rule για να αποδεχόμαστε και να ανακατευθύνουμε τα requests /.well-known/acme-challenge/* στο acme-challenge Target Group. Όταν ολοκληρώσεις αυτό το βήμα, η οθόνη σου θα μοιάζει με την παρακάτω.

Τώρα, είμαστε έτοιμοι να ζητήσουμε ένα Let's Encrypt SSL από το ACME και να το εκδώσουμε χωρίς κανένα πρόβλημα και να το εισάγουμε στο ACM και να το αναθέσουμε στο AWS ALB : ) Αυτή η διαδικασία περιλαμβάνει τρία διαφορετικά βήματα για την έκδοση.
- Αίτηση SSL από το Let's Encrypt
- Εισαγωγή του εκδοθέντος SSL αν το domain ή subdomain ταιριάζει με το AWS ALB CNAME record
- Ανάθεση του εισαχθέντος SSL certificate στο AWS ALB για χρήση στην παραγωγή
Ας Εκδώσουμε και Ας Ζητήσουμε ένα Let's Encrypt SSL από το ACME
Όταν κάνεις clone το git repository, πρέπει να μετακινήσεις τον φάκελο /opt/alble/renewal-hooks κάτω από το path /etc/letsencrypt/. Διαφορετικά, δεν μπορείς να ανανεώσεις το certificate στο ACM και η ασφάλεια τόσο η δική σου όσο και των πελατών σου θα αποτύχει. Μπορείς να αντιγράψεις και να επικολλήσεις mv /opt/alble/renewal-hooks /etc/letsencrypt/
Απλά διάβασε το README.md file στο git repository και γράψε τις μεταβλητές σου στο env file. Μετά από αυτό, μπορείς εύκολα να τρέξεις/διαχειριστείς/δημιουργήσεις τα Let's Encrypt SSL certificates στο AWS Application Load Balancer. Συνιστώ να χρησιμοποιήσεις το AWS SSM για να τρέξεις την εντολή στον acme-challange-server για έκδοση SSL. Γι' αυτό, πρέπει να προσθέσεις το policy στο IAM Role σου.
AmazonEC2RoleforSSM
Αποφάσισα να χρησιμοποιήσω ένα subdomain για δοκιμή, αλλά δεν έχει σημασία. Μπορείς επίσης να χρησιμοποιήσεις root domain. Τα domains δοκιμής μου είναι awsle-1.ercanermis.com και awsle-2.ercanermis.com
Όταν βρίσκεσαι στο path /opt/alble/, μπορείς να τρέξεις την εντολή όπως ./create-new-site.sh awsle-1.ercanermis.com και θα δεις το output όπως παρακάτω.

Το script μου ALBLe ελέγχει πρώτα το CNAME record για το domain ή/και subdomain και βεβαιώνεται πριν συνεχίσει. Αν γράψεις λάθος domain/subdomain ή κάνεις τυπογραφικό, θα σε προειδοποιήσει μέσω Slack alerts. Τα alerts είναι πραγματικά σημαντικά για την αυτοματοποίηση. Μπορείς να ρυθμίσεις τα Slack Alerts στο env file. Ορίστε το παράδειγμα αν έχεις εκδώσει το Let's Encrypt SSL προηγουμένως:

Production
Το AWS ALB DNS name μου είναι web-application-elb-1302305711.us-east-1.elb.amazonaws.com και μπορώ να έχω πρόσβαση μέσω https://web-app.ercanermis.com. Χρησιμοποιεί το AWS Certificate Manager για να αποκτήσει SSL.
Τα domains δοκιμής μου είναι https://awsle-1.ercanermis.com και https://awsle-2.ercanermis.com και χρησιμοποιούν Let's Encrypt με AWS Application Load Balancer, ναι! : )



Πώς φαίνονται τα AWS ALB SSL Certificates και το ACM;


Ελπίζω αυτό το άρθρο να σε βοηθήσει! P.S. Μην ξεχάσεις να ορίσεις ένα cron για τα renewal requests.
Source code: https://github.com/flightlesstux/alble/
Περισσότερα από τον Ercan
Δύο ακόμη ιστότοποι, ίδιος συγγραφέας, διαφορετικό έδαφος.
AI, LLMs, agents, εφαρμοσμένη ML.
Σημειώσεις πεδίου για AI workloads. Ανάλυση κόστους Bedrock, agent patterns, trade-offs αποθήκευσης διανυσμάτων, failure modes σε παραγωγή.
Επισκεφθείτε ercan.ai →Ο κόμβος. Σχετικά, συμβουλευτική, επικοινωνία.
Προσωπικός κόμβος και για τις δύο διαδρομές γραφής. Ποιος είμαι, πώς λειτουργεί η συμβουλευτική, πώς να επικοινωνήσετε.
Επισκεφθείτε ercanermis.com →