O documento a seguir, tem como objetivo demonstrar uma automação do processo de renovação de certificados SSL Wildcard da Let's Encrypt. No exemplo, estou usando como servidor de Job o Jenkins para renovar o certificado *.techroute.com.br semanalmente, esse job é responsável por executar o processo de renovação na let's encrypt, criar um registro do tipo TXT no DNS (Route 53), receber os certificados e enviá-los para uma bucket S3.
- Bucket S3 - será utilizada para armazenar os certificados gerado a partir do job do jenkins
- Usuário IAM (acesso apenas programático) na AWS
- Os seguintes pacotes instalados no sistema operacional do Jenkins (
awscli python3-certbot-nginx e python3-certbot-dns-route53
) - Policy com permissão de mudanças na zona de DNS do Route 53
- Policy com permissão de escrita (Put) na bucket S3 criada
- Servidor do Jenkins
- Zona de DNS no Route 53
sudo apt-get install awscli python3-certbot-nginx python3-certbot-dns-route53 -y
Crie uma bucket S3, para demonstração criamos a bucket "certificados-ssl.techroute.com.br"
- Crie um usuário IAM na AWS, criei como demonstração o usuário
svc.letsencrypt
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:GetChange"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets"
],
"Resource": [
"arn:aws:route53:::hostedzone/$ID_DA_ZONA"
]
}
]
}
Crie uma policy IAM com permissão de escrita (Put) na bucket criada no passo 1 e atache ao usuário IAM svc.letsencrypt
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::certificados-ssl.techroute.com.br/*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}
- Configure as credenciais IAM da AWS no servidor do Jenkins por meio do comando
aws configure
no terminal, caso o servidor do Jenkins seja um EC2 da AWS, crie uma role e associe as policies dos passos 3.2 e 4
Crie um job Freestyle project
no Jenkins, para fins de demonstração, definimos o nome auto-renew-wildcard-ssl-techroute.com.br
defina um nome da sua preferência, clique em [OK] para salvar.
Abra o job criado no passo anterior, no campo description
insira uma descrição que corresponda com o propósito do job, marque a opção "This project is parameterized", do tipo String Parameter
, ou seja, job que recebe parâmetros do tipo string, exemplo abaixo:
Adicione um novo parâmetro, clicando em [Add Parameter]
o tipo do parâmetro será Credentials Parameter
Em Credential type
selecione AWS Credentials
em Default Value
clique em [Add] -> [Jenkins], esse passo é necessário se você ainda não tem a credencial AWS cadastrada no seu Jenkins. Insira um descritivo para credencial que está sendo cadastrada, preencha os campos conforme a imagem e clique em [Add]
Desça a barra de rolagem para baixo e na sessão Build Triggers
marque o item Build periodically
defina os dias que deseja que o job seja executado, na demonstração, defini a execução todos os sábados às 21:00
Na sessão Build
, selecione a opção Execute Shell
e insira o script abaixo:
Nota: Lembre-se de alterar o endereço de email da requisição
WORKSPACE="/var/jenkins_home/workspace/auto-renew-wildcard-ssl-techroute.com.br"
cd $WORKSPACE
rm -rf SSL
mkdir SSL
SSL="$WORKSPACE/SSL"
/usr/bin/certbot certonly --agree-tos --email alanqueiroz@outlook.com --config-dir $SSL/config --logs-dir $SSL/logs --work-dir $SSL/work --dns-route53 -n -d *.$DOMINIO_DO_CLIENTE --server https://acme-v02.api.letsencrypt.org/directory
cd SSL/config/archive/$DOMINIO_DO_CLIENTE
mv privkey* $DOMINIO_DO_CLIENTE-private.key
mv fullchain* $DOMINIO_DO_CLIENTE-fullchain.pem
mv cert* $DOMINIO_DO_CLIENTE-cert.pem
Em Post-build Actions
selecione Publish artifacts to S3 Bucket
Configure o Post-build Actions
conforme a imagem abaixo e clique em [Save]
: