如何使用让我们在Ubuntu 14.04加密安全的Nginx

介绍

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

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

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

先决条件

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

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

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

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

一旦你把所有的先决条件闪开,让我们继续来安装certbot-auto让我们的加密客户端软件。

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

第一步用咱们加密获得SSL证书是安装certbot-auto在服务器上的软件。 目前,安装的最佳途径certbot-auto客户端是从EFF的下载网站下载它。 客户端将在安装后根据需要自动下拉可用更新。

我们也可以下载certbot-auto让我们的加密客户端向/usr/local/sbin键入目录:

cd /usr/local/sbin
sudo wget https://dl.eff.org/certbot-auto

您现在应该有一个副本certbot-auto/usr/local/sbin的目录。

键入以下内容以使脚本可执行:

sudo chmod a+x /usr/local/sbin/certbot-auto

certbot-auto客户现在应该可以使用了。

第2步 - 获得证书

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

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

如何使用Webroot插件

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

如果你还没有安装Nginx,使用这个命令:

sudo apt-get update
sudo apt-get install nginx

为了确保该目录可访问certbot-auto进行验证,让我们做一个快速的变化给我们的Nginx的配置。 默认情况下,它位于/etc/nginx/sites-available/default 我们将用nano来编辑它:

sudo nano /etc/nginx/sites-available/default

在服务器块中,添加此位置块:

添加到SSL服务器块
server {
        . . .

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

        . . .
}

您还需要仰望你的文档根目录是通过搜索设置为root指令,如路径是需要使用的Webroot的插件。 如果您使用的是默认的配置文件,根会/usr/share/nginx/html

保存并退出。

检查配置文件是否有语法错误:

sudo nginx -t

如果一切正常,请使用此命令重新启动Nginx:

sudo service nginx restart

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

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

注: certbot-auto软件需要超级用户权限,所以你会被要求,如果你还没有使用输入密码sudo最近。

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

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

电子邮件提示

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

让我们加密用户协议

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

Output: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 然而,让我们的客户端加密创建符号链接在最新的证书文件/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

现在您有一个SSL证书,您需要配置您的Nginx Web服务器使用它。

编辑包含服务器块的Nginx配置。 再次,这是在/etc/nginx/sites-available/default默认为:

sudo nano /etc/nginx/sites-available/default

找到server 。块注释掉删除配置此服务器块侦听端口80在默认配置中的线,这两条线应该被删除:

Nginx配置删除
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

我们将配置此服务器块在端口443侦听,启用SSL。 在您的server {块,加上下面几行,但替换所有的实例example.com用自己的域名:

Nginx配置添加 - 1 of 3
        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,并指示它使用我们之前获取的Let's Encrypt SSL证书。

要仅允许最安全的SSL协议和密码,并使用我们生成的强Diffie-Hellman组,请将以下行添加到同一服务器块:

Nginx配置添加 - 2之3
        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;

最后,在原始服务器块(即正在侦听HTTPS,端口443)之外,添加此服务器块以将HTTP(端口80)重定向到HTTPS。 请务必使用您自己的域名替换突出显示的部分:

Nginx配置添加 - 3之3
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

保存并退出。

键入以下内容以测试配置文件是否存在语法错误:

sudo nginx -t

一旦您验证了没有语法错误,通过重新启动Nginx使更改生效:

sudo service nginx restart

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

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

In a web browser:https://www.ssllabs.com/ssltest/analyze.html?d=example.com

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

第4步 - 设置自动续订

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

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

certbot-auto renew

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

Output:Checking for new version...
Requesting root privileges to run letsencrypt...
   /home/sammy/.local/share/letsencrypt/bin/letsencrypt 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

添加以下行:

crontab entry30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload

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

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

结论

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

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏