In this guide you can find how to resolve the following issues.
- request a new certificate
- set up Nginx to enable your certificate
- check SSL configuration rating on your HTTPS site
- renew a certificate
Request a new certificate
Get certbot
Go to any directory and clone repo with sources.
cd ~
git clone https://github.com/certbot/certbot
Directory certbot
will be created
Request a certificate
Put a domain name into a variable.
DOMAIN=example.com
Go to certbot's directory
cd certbot
Request a certificate for your domains. You don't need to edit this command
./certbot-auto certonly --manual -d *.$DOMAIN -d $DOMAIN --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory --register-unsafely-without-email --rsa-key-size 4096
You will see a block with value for a new DNS record.
-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:
qqiR_lsa2AjMfoVR16mH4UDbOxy_E02l0K1CNyz1RdI
Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue
Open a DNS panel for you domain name and add a new TXT record. Then go back to the terminal and press Enter. You will be asked to add another one record.
Vscale Panel for example:
Before pressing Enter the second time you can check if records were deployed. Open a new terminal window and run the following command.
host -t txt _acme-challenge.example.com
You will see a response from the DNS with your values.
_acme-challenge.example.com descriptive text "qqiR_lsa2AjMfoVR16mH4UDbOxy_E02l0K1CNyz1RdI"
_acme-challenge.example.com descriptive text "oMmMa-fDLlebdUhvhMD5MinJ2EeFpdP0F9lUPTShh4w"
If these records are correct then press Enter and see the result of issuing.
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2018-06-11. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Congratulations. You have got a new wildcard certificate for your domain example.com
and its second-level subdomains *.example.com
.
Set up Nginx
Now we need to add a new snippet with ssl-params.
Go to snippets directory and create a new one.
cd /etc/nginx/snippets
nano ssl.conf
Add the following lines, save and exit the editor (Ctrl+X
, Y
, Enter
).
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
Then you have to create a directory for certificates snippets.
mkdir certs
cd certs
Create a new file that will hold certificate's params.
nano example.com
Add paths to the wildcard certificate.
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
Usage
Now you have to include params in site's config.
Separated http and https servers
server {
# Listen default port for http
listen 80;
# Server name for this config
server_name example.com;
# Force redirect to https
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
# Listen https connections
listen 443 ssl;
# Server name for this config
server_name example.com;
# Include common ssl params
include snippets/ssl.conf;
# Include certificate params
include snippets/certs/example.com;
# Your custom nginx params for the site
# This case returns page with a plain text
add_header Content-Type text/plain;
return 200 "Hello, World!";
}
Single server config for a site
server {
# Listen default port for http
listen 80;
# Listen https connections
listen 443 ssl;
# Server name for this config
server_name example.com;
# Include common ssl params
include snippets/ssl.conf;
# Include certificate params
include snippets/certs/example.com;
# Force redirect to https
if ($scheme != "https") {
return 301 https://$server_name$request_uri;
}
# Your custom nginx params for the site
# This case returns page with a plain text
add_header Content-Type text/plain;
return 200 "Hello, World!";
}
Result
This guide can help you get an A+
rating on test by ssllabs.com
Renewing certificate
There are no methods to automate DNS verification, so at time X you can request a new certificate again via step 2. Local certificate will be updated. Do not forget to reload nginx service.