Just had to do some letsencrypt setup in some servers so I figured I should write down what I did so I can just check this page again instead of digging how I did it previously.
Requirements:
- nginx
- certbot
This assumes the server only serves https and redirects all http traffic. Adjust as needed otherwise.
Full nginx SSL/TLS config not included.
First add this config to nginx to handle verification:
# part of default port 80 config block
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
And then create the directory (I’m not actually sure if needed):
# mkdir -p /var/www/certbot
Make the first cert because I’m too lazy to ensure the config directory is setup correctly:
# certbot certonly --webroot -w /var/www/certbot -d DOMAIN_NAME_GOES_HERE --keep --agree-tos --email SOME_KIND_OF@EMAIL_ADDRESS --no-eff-email
At this step, the certificate and all should have been properly generated.
Then use it in nginx configuration, the relevant server block:
ssl_certificate /etc/letsencrypt/live/DOMAIN_NAME_GOES_HERE/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/DOMAIN_NAME_GOES_HERE/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/DOMAIN_NAME_GOES_HERE/chain.pem;
If the full path seems too long, symlink it to nginx config base directory or something.
Update certbot CLI configuration located at /etc/letsencrypt/cli.ini
:
rsa-key-size = 4096
text = True
authenticator = webroot
webroot-path = /var/www/certbot
To add more certificates:
# certbot certonly -d ANOTHER_DOMAIN
Don’t forget to update nginx configuration as before.
Since the certificate needs renewal periodically, create this simple script:
#!/bin/sh
# I personally put this in /root/bin/refresh-ssl-certbot
/usr/bin/certbot renew
/path/to/sbin/nginx -s reload
Make executable, etc. Try it to make sure it runs properly.
Then add it crontab. I usually do it weekly.
And done.
There might be smarter way using certbot’s nginx plugin or something but I haven’t bothered reading its documentation and initially this was just a stopgap switching from acme-client which is way simpler but stopped working for me few months ago.