如何使用让我们在CentOS 7加密安全的Nginx

在本教程中,我们将向您展示如何使用让我们加密,以获得一个免费的SSL证书和Nginx的使用它在CentOS 7.我们还将向您展示如何自动更新您的SSL证书。如果你正在运行一个不同的Web服务器,只需按照您的Web服务器的文档,以了解如何使用证书与您的设置。

介绍

Let's Encrypt是一个新的证书颁发机构(CA),它提供了一种简单的方法来获取和安装免费的TLS / SSL证书,从而在Web服务器上启用加密的HTTPS。 它通过提供一个软件客户端,简化了过程certbot ,试图的所需的步骤大部分(如果不是全部)自动化。 目前,获取和安装证书的整个过程仅在Apache Web服务器上完全自动化。 但是,Let's Encrypt可以用于轻松获取免费的SSL证书,可以手动安装,无论您选择哪种Web服务器软件。

在本教程中,我们将向您展示如何使用certbot让我们加密客户端,以获得一个免费的SSL证书和Nginx的使用它在CentOS 7.我们还将向您展示如何自动更新您的SSL证书。 如果您运行的是其他网络服务器,只需按照网络服务器的文档来了解如何在设置中使用证书。

Nginx与让我们加密TLS / SSL证书和自动更新

先决条件

在学习本教程之前,您需要了解一些内容。

你应该有谁拥有非root用户的CentOS 7服务器sudo权限。 你可以学习如何通过以下第1步-3在我们建立这样一个用户帐户初始服务器设置为CentOS 7教程

您必须拥有或控制您希望使用证书的注册域名。 如果您还没有注册域名,您可以向其中一个域名注册商(例如Namecheap,GoDaddy等)注册一个域名。

如果你还没有准备好,一定要创建一条A记录指向你自己的域名服务器的公网IP地址。 这是必需的,因为Let's Encrypt验证您拥有它为其颁发证书的域。 例如,如果你想获得一个证书example.com ,该域必须解析到服务器的验证过程工作。 我们的安装程序将使用example.comwww.example.com作为域名,所以需要两个DNS记录

一旦你拥有所有的先决条件,让我们继续安装Let's Encrypt客户端软件。

第1步 - 安装Certbot让我们加密客户端

第一步用咱们加密获得SSL证书是安装certbot您的服务器上的软件。 目前,最好的安装方法是通过EPEL存储库。

通过键入以下内容来启用对服务器上的EPEL存储库的访问:

sudo yum install epel-release

一旦库已启用,可以获取certbot通过键入包:

sudo yum install certbot

certbot让我们的客户端加密现在应该安装并投入使用。

第2步 - 获得证书

Let's Encrypt提供了通过各种插件获取SSL证书的各种方法。 不同的是Apache的插件,它是覆盖在不同的教程 ,大多数的插件只会帮助你得到,你必须手动配置你的Web服务器使用证书。 仅获取证书而不安装证书的插件称为“验证器”,因为它们用于验证服务器是否应颁发证书。

我们会告诉你如何使用Webroot的插件来获取SSL证书。

如何使用Webroot插件

Webroot公司的工作插件放置在一个特殊的文件/.well-known目录文档根目录下,它可以打开(通过Web服务器)内由让我们的加密服务进行验证。 根据配置的不同,你可能需要明确允许访问/.well-known目录。

如果你还没有安装Nginx,你现在可以这样做。 EPEL存储库应该已经从上一节中启用,因此您可以通过键入以下命令来安装Nginx:

sudo yum install nginx

为了确保该目录可以通过Let's Encrypt进行验证,让我们快速更改我们的默认Nginx服务器块。 默认Nginx的配置文件,使我们能够轻松地在添加文件指令添加到端口80的服务器块/etc/nginx/default.d目录。 如果您使用的是默认配置,创建一个名为新文件le-well-known.conf并打开它使用此命令编辑:

sudo vi /etc/nginx/default.d/le-well-known.conf

然后粘贴到这些行:

/etc/nginx/default.d/le-well-known.conf
location ~ /.well-known {
        allow all;
}

保存并退出。

键入以下内容以检查语法错误的配置:

sudo nginx -t

如果没有报告错误,使用此命令启动Nginx:

sudo systemctl restart nginx

如果你不使用默认的服务器模块,您将需要查找通过寻找你的文档根目录设置为root在默认的Nginx服务器块指令。 这是一个让我们的加密要求,作为值webroot-path ,使用Webroot的插件的时候。 默认的根是/usr/share/nginx/html

现在我们知道我们的webroot-path ,我们可以使用Webroot公司的插件要求使用这些命令的SSL证书。 在这里,我们也与我们的指定域名-d选项。 如果你想有一个单一的证书与多个域名的工作(如example.comwww.example.com ),一定要包括所有的人。 此外,请确保使用适当的webroot路径和域名替换突出显示的部分:

sudo certbot certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com

之后certbot初始化,将提示您输入一些信息。 确切的提示可能会因如果你已经使用的不同而不同certbot之前,但我们会通过在第一时间踩你。

在提示时,输入将用于通知和丢失的密钥恢复的电子邮件地址:

电子邮件提示

那么你必须同意让我们加密订阅协议。 选择同意:

让我们加密用户协议

如果一切顺利,你应该看到一个类似下面的输出消息:

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to sammy@digitalocean.com
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your
   cert will expire on 2016-03-15. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
 - If like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

您将要记录证书的路径和到期日期,这在示例输出中突出显示。

防火墙注意:如果你收到这样的错误Failed to connect to host for DVSNI challenge ,您的服务器的防火墙可能需要配置以允许端口TCP流量80443

注意:如果您的域名是通过像CloudFlare的一个DNS服务路由,则需要暂时禁用它,直到你获得的证书。

证书文件

获得证书后,您将拥有以下PEM编码的文件:

  • cert.pem:域的证书
  • chain.pem:该让我们的加密证书链
  • fullchain.pem: cert.pemchain.pem结合
  • privkey.pem:您证书的私钥

重要的是,您知道刚刚创建的证书文件的位置,因此您可以在Web服务器配置中使用它们。 这些文件本身被放置在一个子目录中/etc/letsencrypt/archive 然而, certbot让我们加密客户端创建符号链接在最新的证书文件/etc/letsencrypt/live/ your_domain_name目录。 因为链接将始终指向最新的证书文件,这是您应该用来引用您的证书文件的路径。

您可以通过运行此命令(在您的域名中替换)检查文件是否存在:

sudo ls -l /etc/letsencrypt/live/your_domain_name

输出应该是前面提到的四个证书文件。 在那一刻,你会配置Web服务器使用fullchain.pem的证书文件, privkey.pem为证书密钥文件。

生成强Diffie-Hellman组

为了进一步提高安全性,您还应该生成一个强的Diffie-Hellman组。 要生成2048位组,请使用以下命令:

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

这可能需要几分钟的时间,但是当它这样做,你将有一个强大的DH组/etc/ssl/certs/dhparam.pem

第3步 - 在Web服务器(Nginx)上配置TLS / SSL

现在您必须编辑Nginx配置以使用Let's Encrypt证书文件。 CentOS上的默认Nginx配置是相当开放的,但我们将创建一个新的服务器块,使用SSL / TLS并侦听端口443.然后我们将配置默认(HTTP在端口80)服务器块重定向到HTTPS启用服务器块。

缺省情况下,附加的服务器块结构可以放置在/etc/nginx/conf.d 创建一个新的文件名为ssl.conf ,并打开它使用此命令编辑:

sudo vi /etc/nginx/conf.d/ssl.conf

然后粘贴在这种配置一定要改变的每个实例。 example.com ,所有四个,用你自己的域名:

/etc/nginx/conf.d/ssl.conf
server {
        listen 443 ssl;

        server_name example.com www.example.com;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;

        location ~ /.well-known {
                allow all;
        }

        # The rest of your server block
        root /usr/share/nginx/html;
        index index.html index.htm;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
}

保存并退出。 这将Nginx配置为使用SSL,并指示它使用我们之前获取的Let's Encrypt SSL证书。 此外,此处指定的SSL选项确保只使用最安全的协议和密码。 请注意,此示例配置仅服务于默认的Nginx页面,因此您可能需要修改它以满足您的需要。

接下来,我们将配置Nginx将端口80上的HTTP请求重定向到端口443上的HTTPS。

默认Nginx的配置文件,使我们能够轻松地在添加文件指令添加到端口80的服务器块/etc/nginx/default.d目录。 创建一个名为新文件ssl-redirect.conf并打开它使用此命令编辑:

sudo vi /etc/nginx/default.d/ssl-redirect.conf

然后粘贴在这行:

/etc/nginx/default.d/ssl-redirect.conf
    return 301 https://$host$request_uri;

保存并退出。 这将配置端口80(默认)服务器块上的HTTP,以将传入请求重定向到HTTPS。

现在,检查语法错误的配置:

sudo nginx -t

如果没有找到错误,重新启动Nginx:

sudo systemctl restart nginx

你还需要启用Nginx,所以它在服务器启动时启动:

sudo systemctl enable nginx

Let's Encrypt TLS / SSL证书现已到位。 此时,您应该通过在网络浏览器中通过HTTPS访问您的域来测试TLS / SSL证书的工作原理。

您可以使用Qualys SSL实验室报告查看您的服务器配置分数:

https://www.ssllabs.com/ssltest/analyze.html?d=example.com

此SSL设置应报告的A +评级。

第4步 - 设置自动续订

让我们加密证书有效期为90天,但建议您每60天更新证书以允许有误差。 在写这篇文章的时候,自动续期还没有上市,作为客户端本身的功能,但您可以手动运行更新您的证书certbot与咱们加密客户端renew选项。

要为所有已安装的域触发更新过程,请运行以下命令:

sudo certbot renew

因为我们最近安装了证书,所以命令将只检查到期日期,并打印一条消息通知证书不是由于更新。 输出应该类似于:

Processing /etc/letsencrypt/renewal/example.com.conf

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.

请注意,如果您创建了具有多个域的捆绑证书,则只有基本域名将显示在输出中,但续订应对此证书中包含的所有域有效。

确保您的证书不会过时的一个实用方法是创建一个定期执行自动更新命令的cron作业。 由于更新首先检查到期日期,并且仅当证书距离到期少于30天时才执行更新,因此可以安全地创建每周或甚至每天运行的cron作业。

让我们编辑crontab来创建一个新作业,它将每周运行续订命令。 要为root用户编辑crontab,请运行:

sudo crontab -e

添加以下行:

30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
35 2 * * 1 /usr/bin/systemctl reload nginx

保存并退出。 这将创建一个新的cron作业将执行certbot renew凌晨2:30命令每星期一,在上午02点35分重装Nginx的(所以续订的证书将被使用)。 由命令生成的输出将通过管道输送到位于日志文件/var/log/le-renewal.log

有关如何创建和调度cron作业的更多信息,你可以检查我们如何使用cron来自动执行任务的VPS引导。

结论

而已! 您的网络服务器现在使用免费的Let's Encrypt TLS / SSL证书来安全地提供HTTPS内容。