Configure SSL Nginx Lets Encrypt Centos 7

Let’s Encrypt is a free, automated, and open certificate authority brought to you by the nonprofit Internet Security Research Group (ISRG).

Lets Encrypt is a free and open certificate provided by ISRG (Internet Security Reaserch Group ) . We are going to integrate Lets Encrypt with Centos 7 and Using Nginx as a reverse proxy .

We assume you already have installed Nginx and CentOs 7 . Lets Encrypt Certificates are also used by lot of hosting providers now a days .

Make sure you have a domain and a Static IP , in order to proceed further .

Install Certbot

sudo yum install certbot

Configure GoDaddy Domain to Run Nginx

Now Make sure you have purchased a GoDaddy domain and you have access to its Doamin Management . Once you Move to Domain Management , you would see something like below .


Click on ADD button , Select A record and enter details as below


Now You need to enter your VPS IP in place of Points To*.

Generate – Hellman key exchange (DH)

As Wrote in Wiki “DH is a way to securely exchange cryptographic keys over public internet .DH is one of the earliest practical examples of public key exchange implemented within the field of cryptography.”

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Setup acme-challenge Lets Encrypt

It is one of the way to validate your domain ownership , lets encrypt exchanges token and validates the authority before generating a SSL certificate .

Now we need to define a path where your Nginx and Lets Encrypt can Collaborate and store token to validate . Once lets encrypt servers token Nginx has to know the URL .

Have a look at the configuration below

sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp nginx /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
sudo mkdir /etc/nginx/snippets

Create following file /etc/nginx/snippets/letsencrypt.conf

location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;

Create File /etc/nginx/snippets/ssl.conf

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;
resolver valid=300s;
resolver_timeout 30s;

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

Configure Domain SSL With Nginx

We are going to configure SSL for domain www.abcd.com . Nginx needs to know the location where lets encrypt going to put files and serve.

Create a file under /etc/nginx/conf.d/yourdoamin.com.conf

server {
  listen 80;
  server_name example.com www.mydnslookup.com;

  include snippets/letsencrypt.conf;

Now before moving to next step to generate certificate using Certbot plugin . You can do this optional step .

Navigate to /etc/nginx and open your default nginx.conf configuration and update the following line marked below .


Generate SSL Certificate

Now we will be moving ahead to generate SSL certificate from lets encrypt . Make sure you reload Nginx before moving ahead .

sudo systemctl reload nginx

sudo certbot certonly --agree-tos --email mydnslookup@gmail.com --webroot -w /var/lib/letsencrypt/ -d mydnslookup.com -d www.mydnslookup.com

Configuring Nginx SSL With Lets Encrypt

Now that we have generated the certificate in above step we are now going to Creating configure and enable Nginx to use that certificate and route to https .

Now what we are going to do is any request that comes from , www.mydomain.com or http://mydomain.com has to be routed to https://mydomain.com . Hence we have used a 301 redirect in nginx configuration .

Have a look at the configuration below

server {
    listen 80;
    server_name www.mydnslookup.com mydnslookup.com;

    include snippets/letsencrypt.conf;
    return 301 https://$host$request_uri;

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/mydnslookup.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydnslookup.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/mydnslookup.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://mydnslookup.com$request_uri;

server {
    listen 443 ssl http2;
    server_name mydnslookup.com;

    ssl_certificate /etc/letsencrypt/live/mydnslookup.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydnslookup.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/mydnslookup.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # . . . other code
sudo systemctl reload nginx

Bingo !!! Now You should be able to run and use SSL with Nginx .

Point to note here is Nginx Can act as a reverse proxy or as a load balancer . You Can do anything you want to using any domain and VPS. Weather it is Centos or Ubuntu or AWS the process of configuring SSL exactly same .

Troubleshooting Guide

  1. In Case You are facing issuess like “Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.” Make Sure You have the Port 80 free .
lsof -i :80

If its blocked kill the port listed from the above command using

kill -2 <ProcessID>

2. Lets Encrypt CertBox Certificate generation failed or ACME challenge Failed

Make sure you check the logs of Nginx /var/log/nginx and check error,log .

Navigate to your nginx logs folder at /var/log/nginx and check are you are getting 404 while generating certificate . If yes then follow option in section Configure Domain SSL With Nginx

Have a look at the complete step by step in this video

Must Follow Tutorials :-

Spring Security Tutorials

Give us like and Share , Comment in case you are also facing some issue like above .I will be happy to help you .