“The Let’s Encrypt project aims to make encrypted connections to World Wide Web servers ubiquitous. By getting rid of payment, web server configuration, validation emails, and dealing with expired certificates it is meant to significantly lower the complexity of setting up and maintaining TLS encryption.” – Wikipedia
Let’s Encrypt is a service provided by the Internet Security Research Group (ISRG), a public benefit organization. Major sponsors are the Electronic Frontier Foundation (EFF), the Mozilla Foundation, Akamai, and Cisco Systems. Other partners include the certificate authority IdenTrust, the University of Michigan (U-M), the Stanford Law School, the Linux Foundation as well as Stephen Kent from Raytheon/BBN Technologies and Alex Polvi from CoreOS.
So, in summary, with Let’s Encrypt you will be able to request for a valid SSL certificate, free of charges, issued for a recognized CA and avoiding the mess of the mails, requests, forms typical of the webpages of the classic CA issuers.
The rest of the article shows the required steps needed for a complete setup of a Nginx server using Let’s encrypt issued certificates:
Install letsencrypt setup scripts:
cd /usr/local/sbin sudo wget https://dl.eff.org/certbot-auto sudo chmod a+x /usr/local/sbin/certbot-auto
Preparing the system for it:
sudo mkdir /var/www/letsencrypt sudo chgrp www-data /var/www/letsencrypt
A special directory must be accesible for certificate issuer:
root /var/www/letsencrypt/; location ~ /.well-known { allow all; }
Service restart. Let’s encrypt will be able to access to this domain and verify the athenticity of the request:
sudo service nginx restart
Note: At this point you need a valid A
DNS entry pointing to the nginx server host. In my example, I will use the mydomain.com
domain as an example.
Requesting for a valid certificate for my domain:
sudo certbot-auto certonly -a webroot --webroot-path=/var/www/letsencrypt -d mydomain.com
If everything is ok, you will get a valid certificate issued for your domain:
/etc/letsencrypt/live/mydomain.com/fullchain.pem
You will need a Diffie-Hellman PEM file for the crypthographic key exchange:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Setting the nginx virtual host
with SSL as usual but using the Let’s encrypt issued certificate:
... ssl on; ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; ...
Check the new configuration and restarting the Nginx:
nginx -t sudo service nginx restart
Renewing the issued certitificate:
cat >> EOF > /etc/cron.d/letsencrypt 30 2 * * 1 root /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 35 2 * * 1 root /etc/init.d/nginx reload EOF