介绍
本教程将向您展示如何在运行 Apache 作为 Web 服务器的 Debian 8 服务器上从 Let's Encrypt设置 TLS/SSL 证书。
SSL证书用于网络服务器中加密服务器和客户端之间的流量,为访问您的应用程序的用户提供额外的安全性。
前提条件
要完成本指南,您将需要一个 Debian 8 服务器,具有非 root 用户,用于管理任务. 您可以通过遵循我们的 Debian 8 初始服务器设置指南来设置具有相应权限的用户。
您必须拥有或控制您希望使用证书的注册域名;如果您还没有注册域名,您可以与许多域名注册商之一(例如 Namecheap、GoDaddy 等)注册域名。
如果你还没有,请确保创建一个 A Record,将你的域名指向你的服务器的公共IP地址(如果你使用DigitalOcean的DNS,你可以遵循这个指南)(https://andsky.com/tech/tutorials/how-to-set-up-a-host-name-with-digitalocean))。这是由于Let's Encrypt如何验证你拥有它正在发行证书的域名所需的要求。
当您准备好继续运行时,请使用 sudo 帐户登录您的服务器。
步骤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
一旦存储库更新,您可以通过瞄准后备端存储库来安装python-certbot-apache
包,该包将引入certbot
:
<$>[注] **注:**使用后端口时,建议只安装所需的特定包,而不是使用存储库进行一般更新。
为了避免意外安装或更新使用此存储库的软件包,您必须明确通过存储库名称的t
标志来安装软件包
1sudo apt-get install python-certbot-apache -t jessie-backports
certbot
客户端现在应该准备好使用。
步骤 2:设置Apache服务器名称和服务器Alias
但是,certbot 也可以从 Apache 配置本身读取这些内容. 由于始终明确你的服务器应该响应的域是很好的做法,我们将直接在 Apache 配置中设置ServerName
和ServerAlias
。
當我們安裝「python-certbot-apache」服務時,如果它已經不在系統上,就安裝了Apache。
1sudo nano /etc/apache2/sites-available/000-default.conf
在虚拟主机区块内,添加或删除ServerName
指令并将其设置为您的主要域名,任何该服务器也应响应的替代域名都可以使用ServerAlias
指令添加。
為我們的例子,我們正在使用「example.com」為我們的典範名稱和「www.example.com」為號.當我們設定這些指令時,它將看起來像這樣:
1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:80>
3 . . .
4 ServerName example.com
5 ServerAlias www.example.com
6 . . .
7</VirtualHost>
完成后,将文件保存并关闭,按住 CTRL并按住 X. 键入 Y并按住 Enter来保存文件。
检查配置文件,查找可能由您的更改引入的任何语法错误:
1sudo apache2ctl configtest
在输出中寻找此行:
1[secondary_label Output]
2Syntax OK
如果文件通过了语法测试,请重新启动 Apache 服务以实现更改:
1sudo systemctl restart apache2
现在Apache已与您的域名配置,我们可以使用certbot
获取我们的SSL证书。
步骤三:调整防火墙
如果您已启用防火墙,则需要调整设置以允许SSL流量。所需程序取决于您正在使用的防火墙软件。
UFW
如果您正在使用 ufw,您可以通过键入查看当前设置:
1sudo ufw status
它可能看起来像这样,这意味着只允许 SSH 流量到 Web 服务器:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6SSH ALLOW Anywhere
7SSH (v6) ALLOW Anywhere (v6)
为了进一步允许 HTTP 和 HTTPS 流量,我们可以允许WWW Full
应用程序配置:
1sudo ufw allow 'WWW Full'
你的状态现在应该是这样的:
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)
HTTP 和 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 --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
规则,则需要确保您使用新规则更新配置。
第4步:设置SSL证书
使用 Let’s Encrypt 客户端生成 Apache 的 SSL 证书非常简单,客户端将自动获得并安装一个新的 SSL 证书,该证书适用于我们 Apache 配置中的域。
要执行交互式安装,并获得在您的 Apache 配置中定义的所有域的证书,请键入:
1sudo certbot --apache
该certbot
实用程序将评估您的Apache配置,以找到应该被要求的证书所覆盖的域。
您将被要求提供一个电子邮件地址,以恢复丢失的密钥和通知,您将能够选择允许http
和https
访问或强迫所有请求重定向到https
。
安装完成后,您应该能够在 /etc/letsencrypt/live
找到生成的证书文件. 您可以通过以下链接验证您的 SSL 证书的状态(不要忘了用您的域代替 example.com):
1https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
测试可能需要几分钟才能完成,您现在应该能够使用https
前缀访问您的网站。
步骤五:设置自动更新
Let's Encrypt 证书有效期为 90 天,但建议您每隔 60 天更新证书,以便出现错误差距。
要启动所有已安装的域的更新过程,您应该运行:
1sudo certbot renew
由于我们最近安装了证书,该命令只会检查到到期日期,并打印消息,通知证书尚未更新。
1[secondary_label Output]
2Saving debug log to /var/log/letsencrypt/letsencrypt.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 工作,该工作会定期为您执行自动更新命令. 由于更新首先检查到到期日期,并且只执行更新,如果证书在到期日期后不到 30 天,例如,创建一个运行每周甚至每天的 cron 工作是安全的。
让我们编辑 crontab 来创建一个新的任务,它将每周运行更新命令。
1sudo crontab -e
您可能会被要求选择一个编辑器:
1[secondary_label Output]
2no crontab for root - using an empty one
3
4Select an editor. To change later, run 'select-editor'.
5 1. /bin/nano <---- easiest
6 2. /usr/bin/vim.basic
7 3. /usr/bin/vim.tiny
8
9Choose 1-3 [1]:
除非您对vim
更舒适,否则请按 Enter 以使用nano
,即默认值。
在 crontab 末尾包含下列内容,全部在一行:
1[secondary_label crontab]
2. . .
330 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
这将创建一个新的cron任务,每周一下午2点30分执行letsencrypt-auto renew
命令,命令产生的输出将被导向位于/var/log/le-renewal.log
的日志文件。
<$>[注] 有关如何创建和安排 cron 工作的更多信息,请参阅我们的 如何在 VPS 中使用 Cron 来自动化任务指南。
结论
在本指南中,我们看到了如何从 Let's Encrypt 安装免费的 SSL 证书,以便保护由 Apache 托管的网站. 我们建议您不时查看官方 Let's Encrypt 博客的重要更新。