介绍
Let's Encrypt是一个新的证书授权机构(CA),它提供了一个简单的方法来获取和安装免费的TLS/SSL证书,从而在Web服务器上启用加密HTTPS。它通过提供一个软件客户端certbot
(以前称为letsencrypt
)来简化这个过程,它试图自动化大多数(如果不是所有)所需的步骤。目前,获取和安装证书的整个过程仅在Apache Web服务器上完全自动化。
在本教程中,我们将向您展示如何使用 Let's Encrypt 获得免费的 SSL 证书,并在 Debian 8 上与 Nginx 一起使用它。
前提条件
在遵循本教程之前,您将需要一些东西。
您应该有一个 Debian 8 服务器,有一个具有sudo
特权的非根用户,您可以通过遵循我们的 Debian 8 初始服务器设置教程来学习如何设置这样的用户帐户。
如果您尚未在您的服务器上安装 Nginx,请遵循 此指南。
您必须拥有或控制您希望使用证书的注册域名;如果您还没有注册域名,您可以与许多域名注册商之一(例如 Namecheap、GoDaddy 等)注册域名。
如果你还没有,请确保创建一个 A Record,将你的域名指向你的服务器的公共IP地址(如果你使用DigitalOcean的DNS,你可以遵循这个指南)(https://andsky.com/tech/tutorials/how-to-set-up-a-host-name-with-digitalocean))。这是由于Let's Encrypt如何验证你拥有它正在发行证书的域名所需的要求。
一旦你有所有的先决条件出路,让我们继续安装Let's Encrypt客户端软件。
步骤1:安装Certbot,让我们加密客户端
使用 Let's Encrypt 获得 SSL 证书的第一步是将 Let's Encrypt 客户端安装在您的服务器上。
当 Debian 8 发布时,certbot
包无法使用。要访问certbot
包,我们必须在我们的服务器上启用 Jessie backports 存储库。
将 backports 存储库添加到您的服务器,键入:
1echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list
添加新的存储库后,更新apt
包索引以下载有关新包的信息:
1sudo apt-get update
一旦存储库更新,您可以通过瞄准后端存储库来安装certbot
包:
<$>[注] 注: 使用后端口时,建议只安装所需的特定包,而不是使用存储库进行一般更新。
为了避免意外安装或更新使用此存储库的软件包,您必须明确通过存储库名称的t
标志来安装软件包。
1sudo apt-get install certbot -t jessie-backports
certbot
客户端现在应该准备好使用。
步骤2:获取SSL证书
Let's Encrypt 提供各种方法来获取 SSL 证书,通过各种插件。 与 Apache 插件不同,该插件被涵盖在 不同的教程,大多数插件只会帮助您获得证书,您必须手动配置您的 Web 服务器来使用。
我们将向您展示如何使用 Webroot插件获得SSL证书。
如何使用 Webroot 插件
Webroot 插件通过在文档根中放置一个特殊的文件,可以通过 Let's Encrypt 服务(通过您的 Web 服务器)进行验证。
如果您尚未安裝 Nginx,請按照 本教程進行。
为了确保目录可访问 Let's Encrypt 进行验证,让我们快速更改我们的 Nginx 配置. 默认情况下,它位于 /etc/nginx/sites-available/default
。
1sudo nano /etc/nginx/sites-available/default
在服务器块中,添加此位置块:
1[label Add to SSL server block]
2 location ~ /.well-known {
3 allow all;
4 }
您还希望通过搜索根
指令来查找文件根的设置,因为需要使用 Webroot 插件的路径. 如果您使用默认配置文件,则根将是 /var/www/html
。
保存和退出。
检查您的配置语法错误:
1sudo nginx -t
1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful
如果没有发现任何错误,请使用此命令重新启动 Nginx:
1sudo systemctl restart nginx
现在我们已经知道我们的webroot-path
,我们可以使用Webroot插件来要求使用这些命令获得SSL证书。在这里,我们还通过d
选项指定我们的域名。如果您想要一个单一的Cert来使用多个域名(例如example.com
和www.example.com
),请确保包括所有这些。
1sudo certbot certonly -a webroot --webroot-path=/var/www/html -d example.com -d www.example.com
在certbot
初始化后,您将被要求输入您的电子邮件并同意Let’s Encrypt
服务条款。之后,挑战将运行。
1[secondary_label Output:]
2IMPORTANT NOTES:
3 - Congratulations! Your certificate and chain have been saved at
4 /etc/letsencrypt/live/example.com/fullchain.pem. Your cert
5 will expire on 2017-09-05. To obtain a new or tweaked version of
6 this certificate in the future, simply run certbot again. To
7 non-interactively renew *all* of your certificates, run "certbot
8 renew"
9 - If you lose your account credentials, you can recover through
10 e-mails sent to [email protected].
11 - Your account credentials have been saved in your Certbot
12 configuration directory at /etc/letsencrypt. You should make a
13 secure backup of this folder now. This configuration directory will
14 also contain certificates and private keys obtained by Certbot so
15 making regular backups of this folder is ideal.
16 - If you like Certbot, please consider supporting our work by:
17
18 Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
19 Donating to EFF: https://eff.org/donate-le
您将需要记住证书的路径和到期日期,这在示例输出中被突出。
<$>[注意]
防火墙 注意: 如果您收到一个错误,如未能为 DVSNI 挑战连接到主机
,您的服务器的防火墙可能需要配置为允许 TCP 流量在端口 80 和
443。
** 注意:** 如果您的域名正在通过 CloudFlare 等 DNS 服务进行路由,您需要暂时禁用该域名,直到您获得证书。
证书档案
获取 cert 后,您将拥有以下 PEM 加密文件:
- cert.pem: 您的域名证书
chain.pem: 让我们加密链证书
fullchain.pem:
cert.pem
和chain.pem
结合 privkey.pem: 您的证书的私钥
重要的是,您知道刚刚创建的证书文件的位置,所以您可以在您的网页服务器配置中使用它们. 这些文件本身被放置在/etc/letsencrypt/archive
的子目录中。 然而,Let’s Encrypt在/etc/letsencrypt/live/your_domain_name
目录中创建了最新的证书文件的符号链接。 因为链接总是指向最新的证书文件,这就是您应该使用的路径来参考您的证书文件。
您可以通过运行此命令来检查文件是否存在(在您的域名中代替):
1sudo ls -l /etc/letsencrypt/live/your_domain_name
输出应该是前面提到的四个证书文件,在一段时间内,您将配置您的Web服务器以使用fullchain.pem
作为证书文件,privkey.pem
作为证书密钥文件。
创建强大的Diffie-Hellman集团
为了进一步提高安全性,您还应该生成一个强大的 Diffie-Hellman 组。
1sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
这可能需要几分钟,但一旦完成,你将有一个强大的DH组在/etc/ssl/certs/dhparam.pem
。
步骤 3:在 Web 服务器上配置 TLS/SSL (Nginx)
现在你有一个SSL证书,你需要配置你的NGINX网络服务器来使用它。
我们将对我们的配置做一些调整:
我们将创建一个包含我们的 SSL 密钥和证书文件位置的配置片段。 2 我们将创建一个包含强大的 SSL 设置的配置片段,可以在未来与任何证书一起使用。 3 我们将调整 Nginx 服务器块来处理 SSL 请求,并使用上述两个片段。
这种配置 Nginx 的方法将使我们能够保持服务器块的清洁,并将常见的配置部分放入可重复使用的模块中。
创建一个指向 SSL 密钥和证书的配置片段
首先,让我们在/etc/nginx/snippets
目录中创建一个新的 Nginx 配置片段。
为了正确地区分这个文件的目的,我们将其命名为ssl-
,然后是我们的域名,然后是末尾的.conf
:
1sudo nano /etc/nginx/snippets/ssl-example.com.conf
在此文件中,我们只需要将ssl_certificate
指令设置为我们的证书文件,并将ssl_certificate_key
设置为相关的密钥。
1[label /etc/nginx/snippets/ssl-example.com.conf]
2ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
3ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
添加这些行后,保存并关闭文件。
使用强大的加密设置创建配置剪辑
接下来,我们将创建另一个片段,将定义一些SSL设置,这将为 Nginx设置一个强大的SSL加密套件,并允许一些先进的功能,这将有助于保持我们的服务器安全。
我们将设置的参数可以在未来的 Nginx 配置中重复使用,因此我们将给该文件一个通用名称:
1sudo nano /etc/nginx/snippets/ssl-params.conf
为了安全地设置 Nginx SSL,我们将使用 Remy van Elst在 Cipherli.st网站上的建议,该网站旨在为流行软件提供易于使用的加密设置。
<$>[注] 注: 在 Cipherli.st上的默认建议设置提供强大的安全性。有时,这会以更高的客户端兼容性为代价。如果您需要支持较旧的客户端,有一个替代列表,可以通过点击标记`是的链接上的链接来访问。
您可以使用兼容性列表,而不是下面的配置中的默认建议。
为了我们的目的,我们可以复制提供的设置全部. 我们只需要做一些小修改。
首先,我们将为上游请求添加我们偏好的 DNS 解析器,我们将使用 Google 的此指南,我们还将继续设置 ssl_dhparam
设置,以指向我们先前生成的 Diffie-Hellman 文件。
最后,您应该花一会儿时间阅读 HTTP 严格运输安全,或 HSTS,特别是关于 重新加载
功能。 预加载 HSTS 提供了更高的安全性,但如果意外启用或不正确启用,可能会产生深远的后果。
1[label /etc/nginx/snippets/ssl-params.conf]
2# from https://cipherli.st/
3# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
4
5ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
6ssl_prefer_server_ciphers on;
7ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
8ssl_ecdh_curve secp384r1;
9ssl_session_cache shared:SSL:10m;
10ssl_session_tickets off;
11ssl_stapling on;
12ssl_stapling_verify on;
13resolver 8.8.8.8 8.8.4.4 valid=300s;
14resolver_timeout 5s;
15# Disable preloading HSTS for now. You can use the commented out header line that includes
16# the "preload" directive if you understand the implications.
17#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
18add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
19add_header X-Frame-Options DENY;
20add_header X-Content-Type-Options nosniff;
21
22ssl_dhparam /etc/ssl/certs/dhparam.pem;
保存并关闭文件,当你完成。
调整 Nginx 配置以使用 SSL
现在我们有我们的片段,我们可以调整我们的 Nginx 配置以启用 SSL。
在本指南中,我们将假设您正在使用/etc/nginx/sites-available
目录中的默认
服务器封锁文件. 如果您正在使用不同的服务器封锁文件,请在下面的命令中替换其名称。
在我们进一步前,让我们备份我们当前的服务器封锁文件:
1sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
现在,打开服务器封锁文件以进行调整:
1sudo nano /etc/nginx/sites-available/default
內部,您的伺服器封鎖可能是這樣開始的:
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80 default_server;
4 listen [::]:80 default_server;
5
6 # SSL configuration
7
8 # listen 443 ssl default_server;
9 # listen [::]:443 ssl default_server;
10
11 . . .
我们将修改此配置,以便未加密的 HTTP 请求自动重定向到加密的 HTTPS. 这为我们的网站提供了最佳的安全性。
我们将将配置分为两个单独的块,在第一个两个倾听
指令之后,我们将添加一个server_name
指令,设置为您的服务器域名,然后我们将设置一个重定向到我们将创建的第二个服务器块。
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80 default_server;
4 listen [::]:80 default_server;
5 server_name example.com www.example.com;
6 return 301 https://$server_name$request_uri;
7}
8
9 # SSL configuration
10
11 # listen 443 ssl default_server;
12 # listen [::]:443 ssl default_server;
13
14 . . .
接下来,我们需要直接在下方启动一个新的服务器块,以包含剩余的配置。我们可以拒绝使用端口443的两个倾听
指令。
<$>[注]
注: 您可能只有一条 一个倾听
指令,其中包含每个 IP 版本和端口组合的 default_server
修改器。
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80 default_server;
4 listen [::]:80 default_server;
5 server_name example.com www.example.com;
6 return 301 https://$server_name$request_uri;
7}
8
9server {
10
11 # SSL configuration
12
13 listen 443 ssl default_server;
14 listen [::]:443 ssl default_server;
15 include snippets/ssl-example.com.conf;
16 include snippets/ssl-params.conf;
17
18 . . .
保存并关闭文件,当你完成。
(替代配置)允许 HTTP 和 HTTPS 流量
如果您想要或需要允许加密和未加密内容,您将不得不以稍微不同的方式配置 Nginx。如果可以避免,通常不建议这样做,但在某些情况下可能需要这样做。
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80 default_server;
4 listen [::]:80 default_server;
5 listen 443 ssl default_server;
6 listen [::]:443 ssl default_server;
7
8 server_name example.com www.example.com;
9 include snippets/ssl-example.com.conf;
10 include snippets/ssl-params.conf;
11
12 . . .
保存并关闭文件,当你完成。
步骤四:调整防火墙
如果您已启用防火墙,则需要调整设置以允许SSL流量。所需程序取决于您正在使用的防火墙软件。
UFW
如果您正在使用 ufw,您可以通过键入查看当前设置:
1sudo ufw status
它可能看起来像这样,这意味着只有HTTP流量被允许到Web服务器:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6SSH ALLOW Anywhere
7WWW ALLOW Anywhere
8SSH (v6) ALLOW Anywhere (v6)
9WWW (v6) ALLOW Anywhere (v6)
为了进一步允许 HTTPS 流量,我们可以允许WWW Full
配置文件,然后删除余额的WWW
配置文件允许:
1sudo ufw allow 'WWW Full'
2sudo ufw delete allow 'WWW'
你的状态现在应该是这样的:
1sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6SSH ALLOW Anywhere
7WWW Full ALLOW Anywhere
8SSH (v6) ALLOW Anywhere (v6)
9WWW Full (v6) ALLOW Anywhere (v6)
HTTPS请求现在应该被您的服务器接受。
标签
如果您正在使用iptables
,您可以通过键入查看当前的规则:
1sudo iptables -S
如果您已启用任何规则,则会显示这些规则. 一个示例配置可能看起来像这样:
1[secondary_label Output]
2-P INPUT DROP
3-P FORWARD ACCEPT
4-P OUTPUT ACCEPT
5-A INPUT -i lo -j ACCEPT
6-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
7-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
8-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
打开 SSL 流量所需的命令将取决于您当前的规则。 对于像上面这样的一套基本规则,您可以通过键入添加 SSL 访问:
1sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
如果我们再次看看防火墙规则,我们应该看到新的规则:
1sudo iptables -S
1[secondary_label Output]
2-P INPUT DROP
3-P FORWARD ACCEPT
4-P OUTPUT ACCEPT
5-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
6-A INPUT -i lo -j ACCEPT
7-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
8-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
9-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
如果您正在使用一个程序在启动时自动应用iptables
规则,则需要确保您使用新规则更新配置。
步骤 5: 启用 Nginx 中的更改
现在,我们已经进行了更改并调整了防火墙,我们可以重新启动 Nginx 来实施新的更改。
首先,我们应该检查,以确保我们的文件中没有语法错误,我们可以通过键入:
1sudo nginx -t
如果一切顺利,你会得到一个看起来像这样的结果:
1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful
如果您的输出匹配上述,您的配置文件没有语法错误. 我们可以安全地重新启动 Nginx 来实现我们的更改:
1sudo systemctl restart nginx
让我们加密 TLS/SSL 证书现在已经到位,防火墙现在允许流量到端口 80 和 443. 在此时,您应该通过访问您的域名通过 HTTPS 在 Web 浏览器中测试 TLS/SSL 证书是否有效。
您可以使用 Qualys SSL Labs 报告来查看服务器配置的分数:
1[secondary_label In a web browser:]
2https://www.ssllabs.com/ssltest/analyze.html?d=example.com
这可能需要几分钟才能完成,本指南中的SSL设置至少应该报告一个 A评级。
步骤6:设置自动更新
Let’s Encrypt 证书有效期为 90 天,但建议您每隔 60 天更新证书,以允许出现错误。 在此写作时,自动更新仍然无法作为客户端本身的功能使用,但您可以通过运行 Let’s Encrypt 客户端以更新
选项来手动更新证书。
要启动所有已安装的域的更新过程,请运行此命令:
1sudo certbot renew
由于我们最近安装了证书,该命令只会检查到到期日期,并打印消息,通知证书尚未更新。
1[secondary_label Output:]
2Saving debug log to /var/log/letsencrypt/example.com.log
3
4-------------------------------------------------------------------------------
5Processing /etc/letsencrypt/renewal/example.com.conf
6-------------------------------------------------------------------------------
7Cert not yet due for renewal
8
9The following certs are not due for renewal yet:
10 /etc/letsencrypt/live/example.com/fullchain.pem (skipped)
11No renewals were attempted.
请注意,如果您创建了包含多个域的组合证书,则输出中只会显示基本域名,但更新应适用于该证书中包含的所有域名。
确保您的证书不会过时的一种实用方法是创建一个 cron 任务,该任务会定期为您执行自动更新命令。
让我们编辑 crontab 来创建一个新的任务,它将每周运行更新命令。
1sudo crontab -e
如果这是你第一次使用crontab
,你可能会被要求选择你喜欢的文本编辑器. 如果你没有强烈的偏好, nano是一个简单的选择。
添加以下几行:
1[secondary_label crontab entry]
230 2 * * * /usr/bin/certbot renew --noninteractive --renew-hook "/bin/systemctl reload nginx" >> /var/log/le-renew.log
这将创建一个新的cron任务,每天下午2点30分执行certbot renew
命令,并在更新证书时重新加载 Nginx。
<$>[注] 注: 有关如何创建和安排 cron 工作的更多信息,您可以查看我们的 如何在 VPS 中使用 Cron 来自动化任务指南。
结论
您的 Web 服务器现在使用免费的 Let’s Encrypt TLS/SSL 证书,以安全地服务 HTTPS 内容。