Professor, Designer, Husband, Father, Gamer, Bagpiper

Last year, I posted about setting up a node server on AWS that pulls it's content from Github and uses LetsEncrypt for SSL.  Six months ago, I posted an update on how to renew the LetsEncrypt certificates.

The manual process was simple, but a bit annoying to have to actually do it.  This time around, I discovered an article discussing a plugin for Nginx that lets me automate this in a trivial way.  (As before, I'm posting this to share with others, but also for easy review by me later!)

I generally followed that article. Since I'm using Ubuntu 18.04 on AWS, I first needed to install the certbot Nginx plugin:

$ sudu apt-get install python3-certbot-nginx

Next, I renewed the certificate I had, but using --nginx as the authorization method instead of --manual:

$ sudo certbot --nginx -d aelatgt.net

Certbot updated my Nginx configuration, which I edited and combined with what I previously had there:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# HTTP - redirect all requests to HTTPS:
server {
    if ($host = aelatgt.net) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80 default_server;
    server_name aelatgt.net;
}

server {
  listen 443 ssl;
  server_name aelatgt.net;
  location / {
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  Host       $http_host;
    proxy_pass        https://127.0.0.1:3001;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
  
    # Enable SSL
    ssl_certificate_key /etc/letsencrypt/live/aelatgt.net/privkey.pem; # managed
 by Certbot
    ssl_certificate /etc/letsencrypt/live/aelatgt.net/fullchain.pem; # managed b
y Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
}

I'd previously had more ssl settings in the file, but certbot created a set in /etc/letsencrypt/options-ssl-nginx.conf so I'm just going to use those.  (I also realize I'm probably "upgrading" HTTP to HTTPS twice in there, but it works and I'm not Nginx god, so "it's fine").

Finally, I added a cronjob to periodically (and quietly) try to renew the certificate, but running

$ crontab -e

and then adding a line to the crontab:

0 12 * * * /usr/bin/certbot renew --quiet

That's it.

To test, I restarted my nginx server a did a trial renewal of the certificate, which output the follow (as expected):

$ sudo nginx -s reload 
$ sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/aelatgt.net.conf
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/aelatgt.net/fullchain.pem expires on 2021-10-01 (skipped)
No renewals were attempted.
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You’ve successfully subscribed to Blair MacIntyre's Blog
Welcome back! You’ve successfully signed in.
Great! You’ve successfully signed up.
Your link has expired
Success! Check your email for magic link to sign-in.