Certbox & NGINX on AWS
Did you know you can use CertBot and NGINX to have a wildcard certificate? Here’s how to do it with an AWS Ubuntu sever.
Prerequisites:
- AWS Route 53 DNS hosted zone
- Web server using NGINX
- Website already configured using SSL
- SSH access with sudo (root) privileges
- Knowledge and comfort navigating linux using the bash shell
- Knowledge and comfort on how to view and edit files in linux (ie. vi, vim, nano…)
Overview:
The high level process to achieve our objective is as follows:
- Installing CertBot
- Installing DNS Plugin
- Create IAM Policy
- Create IAM Role
- Associate IAM Role with EC2 Instance
- Run CertBot and get new Certs
- Update NGINX to use new SSL Certs
- Test and restart NGINX
- Validate SSL Cert
- Test and review CertBot auto renewal
Disclaimer: As with any change, please make sure that you have created a Jira ticket, received proper approval, notified business partners, scheduled the action and taken the necessary actions to backup and recover should anything go wrong.
Installing CertBot:
SSH to the web server and run the following commands:
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python-certbot-nginx
Install DNS Plugin:
SSH to the web server and run the following command:
sudo apt-get install python3-certbot-dns-route53
Create IAM Policy:
See also: https://certbot-dns-route53.readthedocs.io/en/stable/
Create new IAM policy using the AWS Route53 ZoneID of the hosted zone that you want to get an SSL Cert for.
{
"Version": "2012-10-17",
"Id": "certbot-dns-route53 sample policy",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:GetChange"
],
"Resource": [
"*"
]
},
{
"Effect" : "Allow",
"Action" : [
"route53:ChangeResourceRecordSets"
],
"Resource" : [
"arn:aws:route53:::hostedzone/YOURHOSTEDZONEID"
]
}
]
}
Create a new IAM Role:
- Click [Create Role] > [AWS Service] > [EC2] > [Next: Permissions]
- Search for and select your newly created Policy (one created from above)
- Click [Next: Tags] > (Enter a TAG if you wish) > [Next: Review]
- Give your new role a meaningful name and description
- Click [Create Role]
Associate Role with EC2 Instance:
- Click to select your EC2 Instance
- Click [Actions] > Instance settings > [Attach / Replace IAM Role]
- In the “IAM Role” dropdown list, click and select the IAM Role that you created (from above)
- Click [Apply] > [Close]
Run CertBot and get new Certs:
It’s important to get both the example.com and *.example.com as WILDCARD certs need to include the naked domain as well as any sub domains.
Note: Be sure to review/update example.com, *.example.com before running the below command.
sudo certbot certonly --dns-route53 -d example.com -d *.example.com --dns-route53-propagation-seconds 30 -m [email protected] --agree-tos
If the above command runs successfully, it will populate the necessary certificate key files into the /etc/letsencrypt/live/example.com/ directory.
Update NGINX to use new SSL Certs:
The next step requires that you update the existing SSL configuration of the NGINX server to use the new LetsEncrypt certs. There are a few common locations to check:
- /etc/nginx/nginx.conf
- /etc/nginx/sites-available/<site name>
- /etc/nginx/snippets/
- Update the following folders with new “fullchain.pem and privkey.pem”
- beta_ssl.conf , fastcgi-php.conf , rc_ssl.conf , snakeoil.conf
Between these locations, you should be able to locate the SSL configuration/settings What your looking are the following two keys:
- ssl_certificate
- ssl_certificate_key
Below is a description of the newly downloaded LetsEncrypt keys
- `privkey.pem` : the private key for your certificate.
- `fullchain.pem`: the certificate file used in most server software.
- `chain.pem` : used for OCSP stapling in Nginx >=1.3.7.
- `cert.pem` : will break many server configurations, and should not be used without reading further documentation
You need to update the following SSL entries to point to the new LetsEncrypt keys
- ssl_certificate /etc/letsencrypt/live/
example.com
/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/
example.com
/privkey.pem;
Test and restart NGINX:
Test that there are no errors in any of your NGINX files by running the following command
sudo nginx -t
If all of the tests come back as successful, you can go ahead and restart the nginx service
sudo service nginx restart
Validate SSL Cert:
Once restarted, open a browser window and visit your site. You want validate that the website is using the new LetsEncrypt SSL cert and that the expiration is set 90 days out.