La maggior parte delle volte, non abbiamo bisogno di altro se non di AWS Certificate Manager (ACM) ma in alcuni casi, se ospiti il dominio del tuo cliente con ALB e non hai la possibilità di ottenere un certificato SSL dal tuo cliente, devi trovare una soluzione alternativa. In questo articolo, emetteremo un certificato SSL Let's Encrypt su AWS Application Load Balancer e lo automatizzeremo!

Quando richiedi un certificato SSL da Let's Encrypt, LE ha alcuni metodi di verifica come web-challenge, route53, ecc. In questo scenario, ho deciso di usare il web-challenge perché la gestione DNS dei domini non è sotto il mio controllo. Ospito solo l'applicazione e devo emettere un SSL.

Quando richiedi un SSL con web-challenge, Let's Encrypt controlla il percorso https://domain.com/.well-known/acme-challenge per verificare. Cosa significa? Significa che Let's Encrypt invierà una richiesta al dominio sulla porta 80 ed effettuerà la verifica. Hmm, dobbiamo fare alcuni aggiustamenti alla configurazione del Load Balancer e abbiamo bisogno di un altro Target Group per reindirizzare specificamente le richieste acme-challenge.

Passo 1: Avviare una nuova EC2 e Creare un Nuovo Target Group

Clonare il Repository

Ho scritto uno script bash per una gestione semplice e per mantenere gli standard allo stesso modo per ogni dominio. Puoi dare un'occhiata al mio repository GitHub o clonare il repository sotto il percorso /opt/ in acme-challange-server

Tip: # git clone https://github.com/flightlesstux/alble.git

Installare nginx, Let's Encrypt e configurarli

Quando riceviamo una richiesta /.well-known/acme-challenge/*, l'EC2 con nginx installato gestirà tutte le richieste acme-challenge ed emetterà un SSL per noi.

Installare nginx e configurare per /.well-known/acme-challenge/

Puoi installare facilmente nginx con il comando amazon-linux-extras install nginx1. Dopo l'installazione, devi inserire un nuovo blocco location nel file di configurazione root di nginx. Il file di configurazione root si trova in /etc/nginx/nginx.conf

        location /.well-known/acme-challenge {
           root /opt/alble/certbot-challange;
        }

Il valore server_name dovrebbe essere _; per tutti i domini. Non possiamo impostare un nome DNS statico.

Installare Certbot con il modulo nginx

Prima di tutto, installeremo certbot dal repository epel e dobbiamo installare epel per primo. Per l'installazione di epel, puoi usare il comando amazon-linux-extras install -y epel e dopo esegui yum install -y nginx certbot python2-certbot-nginx jq dig per coprire i prerequisiti.

Policy del Ruolo IAM per il Server acme-challenge

Questo server acme-challenge ha un Ruolo IAM per accedere alle operazioni ACM e ALB con i certificati SSL Let's Encrypt. Puoi vedere la Policy IAM qui sotto.

{
    "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"
                }
            }
        }
    ]
}

Puoi allegare questa policy direttamente al server acme-challenge senza problemi di sicurezza dopo aver assegnato un Elastic IP. Se vuoi usare credenziali locali, puoi anche usare la stessa Policy IAM.

Creare un Nuovo Target Group

Dopo la configurazione dell'istanza EC2, ho creato un Target Group chiamato acme-challenge e reindirizzo la richiesta all'EC2 con nginx installato chiamato acme-challange-server e registro il nostro acme-challenge-server come target. Se tutto va senza problemi, il tuo schermo sarà simile a questo.

Passo 2: Creare una Regola del Listener dell'Application Load Balancer

Dobbiamo modificare e creare una nuova regola del listener per accettare e reindirizzare le richieste /.well-known/acme-challenge/* al Target Group acme-challenge. Dopo questo passaggio, il tuo schermo sarà simile a questo.

Ora siamo pronti per richiedere un SSL Let's Encrypt da ACME ed emetterlo senza problemi, importarlo in ACM e assegnarlo all'ALB AWS : ) Questa operazione contiene tre diversi passaggi per l'emissione.

  1. Richiedere un SSL da Let's Encrypt
  2. Importare l'SSL richiesto se il dominio o sottodominio corrisponde al record CNAME dell'ALB AWS
  3. Assegnare il certificato SSL importato all'ALB AWS per l'uso in produzione

Emettiamo e Richiediamo un SSL Let's Encrypt da ACME

Quando cloni il repository git, devi spostare la cartella /opt/alble/renewal-hooks sotto il percorso /etc/letsencrypt/. Altrimenti, non puoi rinnovare il certificato su ACM e la sicurezza tua e dei tuoi clienti verrebbe compromessa. Puoi copiare e incollare mv /opt/alble/renewal-hooks /etc/letsencrypt/

Leggi il file README.md nel repository git e scrivi le tue variabili nel file env. Dopodiché, puoi facilmente eseguire/gestire/creare i certificati SSL Let's Encrypt su AWS Application Load Balancer. Raccomando di usare AWS SSM per eseguire il comando su acme-challange-server per emettere un SSL. Per questo, dovresti aggiungere la policy AmazonEC2RoleforSSM al tuo Ruolo IAM.

Ho deciso di usare un sottodominio per i test ma non importa. Puoi anche usare un dominio root. I miei domini di test sono awsle-1.ercanermis.com e awsle-2.ercanermis.com

Quando sei nel percorso /opt/alble/, puoi eseguire il comando come ./create-new-site.sh awsle-1.ercanermis.com e vedrai l'output come qui sotto.

Il mio script ALBLe controlla prima il record CNAME per il dominio e/o sottodominio e si assicura prima di continuare. Se scrivi un dominio/sottodominio sbagliato o fai un errore di battitura, ti avviserà tramite avvisi Slack. Gli avvisi sono davvero importanti per l'automazione. Puoi impostare gli Slack Alert nel file env. Ecco l'esempio se hai già emesso il certificato SSL Let's Encrypt prima;

Produzione

Il mio nome DNS ALB AWS è web-application-elb-1302305711.us-east-1.elb.amazonaws.com e posso accedervi via https://web-app.ercanermis.com. Utilizza AWS Certificate Manager per ottenere un SSL.

I miei domini di test sono https://awsle-1.ercanermis.com e https://awsle-2.ercanermis.com e utilizzano Let's Encrypt con AWS Application Load Balancer, sì! : )

https://web-app.ercanermis.com utilizza un SSL fornito da Amazon
https://awsle-1.ercanermis.com utilizza un SSL fornito da Let's Encrypt
https://awsle-2.ercanermis.com utilizza un SSL fornito da Let's Encrypt

Come appaiono i Certificati SSL e ACM dell'ALB AWS?

Ecco lo screenshot dei Certificati SSL dell'ALB
Ecco lo screenshot in Amazon Certificate Manager

Spero che questo articolo ti sia d'aiuto! P.S. Non dimenticare di impostare un cron per le richieste di rinnovo.
Codice sorgente: https://github.com/flightlesstux/alble/