介绍
Let's Encrypt是一个新的证书颁发机构(CA),它提供了一种简单的方法来获取和安装免费的TLS / SSL证书,从而在Web服务器上启用加密的HTTPS。 它通过提供一个软件客户端,简化了过程certbot
,试图的所需的步骤大部分(如果不是全部)自动化。 目前,获取和安装证书的整个过程仅在Apache Web服务器上完全自动化。 但是,Let's Encrypt可以用于轻松获取免费的SSL证书,可以手动安装,无论您选择哪种Web服务器软件。
在本教程中,我们将向您展示如何使用certbot-auto
让我们的客户端进行加密,以获得一个免费的SSL证书和Nginx的在Ubuntu 14.04使用它。 我们还将向您展示如何自动更新您的SSL证书。 如果您运行的是其他网络服务器,只需按照网络服务器的文档来了解如何在设置中使用证书。
先决条件
在学习本教程之前,您需要了解一些内容。
你应该有一个Ubuntu 14.04服务器谁拥有非root用户sudo
权限。 你可以学习如何按照我们的第1步-3建立这样一个用户帐户初始服务器设置为Ubuntu 14.04的教程 。
您必须拥有或控制您希望使用证书的注册域名。 如果您还没有注册域名,您可以向其中一个域名注册商(例如Namecheap,GoDaddy等)注册一个域名。
如果你还没有准备好,一定要创建一条A记录指向你自己的域名服务器的公网IP地址。 这是必需的,因为Let's Encrypt验证您拥有它为其颁发证书的域。 例如,如果你想获得一个证书example.com
,该域必须解析到服务器的验证过程工作。 我们的安装程序将使用example.com
和www.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
在服务器块中,添加此位置块:
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.com
和www.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流量80
和443
。
注意:如果您的域名是通过像CloudFlare的一个DNS服务路由,则需要暂时禁用它,直到你获得的证书。
证书文件
获得证书后,您将拥有以下PEM编码的文件:
- cert.pem:您的域的证书
- chain.pem:该让我们的加密证书链
- fullchain.pem:
cert.pem
和chain.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在默认配置中的线,这两条线应该被删除:
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
我们将配置此服务器块在端口443侦听,启用SSL。 在您的server {
块,加上下面几行,但替换所有的实例example.com
用自己的域名:
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组,请将以下行添加到同一服务器块:
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。 请务必使用您自己的域名替换突出显示的部分:
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内容。