写在前边
为什么要部署 Https
说到底,就是 https 更安全。甚至为了安全,一个专业可靠的网站, https 是必须的。如今,没有部署 Https 的网站,无论是 Chrome 还是 Firefox,都会将其标记为醒目的不安全网站。Https 的网站,还能够防止 DNS 被劫持,注入广告。所以,为什么不呢?
什么是 Let's Encrypt
Let's Encrypt
是一个免费,自动化和开放的证书颁发机构(CA),为公众的利益而运行。它是由Internet Security Research Group(ISRG)提供的服务。
其为用户提供所需的数字证书,以便以最友好的方式免费为网站启用 HTTPS(SSL / TLS)。我们这样做是因为我们想要创建一个更安全,更尊重隐私的 Web。
Let's Encrypt
背后的关键原则是:
免费:拥有域名的任何人都可以使用
Let's Encrypt
以零成本获得可信证书。自动:在 Web 服务器上运行的软件可以与
Let's Encrypt
交互,以便轻松获取证书,安全地配置它以供使用,并自动进行续订。安全:让
Let's Encrypt
将作为推动 TLS 安全最佳实践的平台,无论是在 CA 方面还是通过帮助网站运营商正确保护其服务器。透明:所有颁发或撤销的证书将被公开记录,供任何人查阅。
开放:自动发布和续订协议将作为其他人可以采用的开放标准发布。
合作:就像基础互联网协议本身一样,让加密是一项让社区受益的共同努力,超越任何一个组织的控制。
Cerbot 就是Let's Encrypt
提供的客户端
安装 Certbot
Certbot 是一个易于使用的自动客户端,可为您的 Web 服务器提取和部署 SSL / TLS 证书。Certbot 由 EFF 和其他人开发,作为Let's Encrypt
的客户端,Certbot 还将与支持 ACME 协议的任何其他 CA 一起使用。
虽然有许多其他客户端实施 ACME 协议来获取证书,但 Certbot 是最广泛的客户端,可以自动配置您的 Web 服务器以立即开始通过 HTTPS 提供服务。对于 Apache,它还可以选择性地自动执行安全任务,例如调整密码套件和启用重要的安全功能,例如 HTTP→HTTPS 重定向,OCSP 装订,HSTS 和升级不安全请求。
Certbot 是 EFF 加密整个互联网的更大努力的一部分。网站需要使用 HTTPS 来保护网络。与 HTTPS Everywhere 一起,Certbot 旨在建立一个结构更私密,更安全且受到保护以防止审查的网络。
Cenos 7/RHEL 7 安装
安装
Certbot 打包在 EPEL(企业 Linux 的额外包)中。要使用 Certbot,必须先 启用 EPEL 存储库。在 RHEL 或 Oracle Linux 上,还必须启用可选通道。
rpm 安装EPEL
1 | sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm |
yum 安装EPEL
1 | sudo yum -y install epel-release |
直接下载EPEL
repo
1 | sudo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo |
注意:
如果您在 EC2 上使用 RHEL,则可以通过运行以下命令启用可选通道:
1 | sudo yum -y install yum-utils |
安装 Cerbot
您可以通过运行以下命令安装 Certbot:
1 | sudo yum install certbot |
Fedora 26 +安装
安装
Certbot 是为您的操作系统打包的,因此安装它只需运行以下命令:
1 | sudo dnf install certbot |
Ubuntu 安装
安装
在 Ubuntu 系统上,Certbot 团队维护PPA。将它添加到存储库列表后,您需要做的就是获取以下包。
1 | sudo apt-get update |
部署证书
安装证书
通常我们使用
webroot
插件来进行安装要使用“webroot”插件获取证书,该插件可以与任何 Web 服务器软件的 webroot 目录一起使用:
1
$ sudo certbot certonly --webroot -w /var/www/abc -d abc.com -d www.abc.com -w /var/www/xyz -d xyz.cn -d m.xyz.cn
此命令将获得
abc.com
,www.abc.com
,xyz.cn
和m.xyz.cn
的单个证书; 它会将文件放在/var/www/abc
下面以证明前两个域的控制,并在/var/www/xyz
下放置第二对。如果需要为多个域名签发证书,可以为web服务器配置代理到同一个目录
Apache 虚拟主机配置添加
1
2
3
4
5
6Alias /.well-known/acme-challenge/ "/var/www/html/.well-known/acme-challenge/"
<Directory "/var/www/html/.well-known/acme-challenge/">
AllowOverride None
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>Nginx 虚拟主机配置添加
1
2
3location /.well-known/acme-challenge/ {
root /var/www/html/;
}如果您想使用
Let's Encrypt
的新 ACMEv2 服务器中的一个插件来发布通配符证书,您还需要在命令行中包含以下标志:1
--server https://acme-v02.api.letsencrypt.org/directory
查看证书位置
通常,证书安装在
/etc/letsencrypt/live
中如步骤一中的例子,
/etc/letsencrypt/live
目录结构为1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17$ cd /etc/letsencrypt/live
$ tree .
.
|-- abc.com
| |-- cert.pem -> ../../archive/abc.com/cert2.pem
| |-- chain.pem -> ../../archive/abc.com/chain2.pem
| |-- fullchain.pem -> ../../archive/abc.com/fullchain2.pem
| |-- privkey.pem -> ../../archive/abc.com/privkey2.pem
| `-- README
`-- xyz.cn
|-- cert.pem -> ../../archive/xyz.cn/cert2.pem
|-- chain.pem -> ../../archive/xyz.cn/chain2.pem
|-- fullchain.pem -> ../../archive/xyz.cn/fullchain2.pem
|-- privkey.pem -> ../../archive/xyz.cn/privkey2.pem
`-- README
2 directories, 10 files通常只有
fullchain.pem
和privkey.pem
用得上
通配符安装
获取证书
1 | sudo certbot certonly -d *.domain.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory |
这个时候千万不要敲enter
。
配置 txt 记录,做 DNS 验证
查看效果
1 | $ dig -t txt _acme-challenge.domain.com @8.8.8.8 |
注意第 15 行的 txt 值,与上面得到的一致。
回到获取命令,敲下enter
1 | Before continuing, verify the record is deployed. |
搞定
配置 Nginx
这里看下nginx
的配置方法,apache
我就不举例说明了
顺便默认把http
重定向到https
1 | server { |
重启服务,大功告成
1 | sudo systemctl reload nginx.service |
自动续订
手动
可以将 Certbot 配置为在证书过期之前自动续订证书。由于Let's Encrypt
证书持续 90 天,因此最好利用此功能。您可以通过运行以下命令来测试证书的自动续订:
1 | sudo certbot renew --dry-run |
如果这看起来工作正常,您可以通过添加运行以下命令的cron 作业或systemd 计时器 来安排自动续订:
1 | sudo certbot renew |
注意:
如果您正在设置cron
或systemd
作业,建议每天运行两次(在您的证书到期或续订之前,它将不会执行任何操作,但定期运行它会使您的站点有机会保持在线状态案例 a 由于某种原因,我们发生了加密启动的撤销。请在一小时内随机选择续订任务。
Crontab
配置
1 | sudo crontab -e |
管理证书
如果你是通配符证书,自然不用更新证书的域名。这里自然是为非通配符用户准备的.
重新创建和更新现有的证书
即使您已拥有具有某些相同域名的现有证书,也可以使用certonly
或run
子命令请求创建单个新证书。
如果请求证书run
或certonly
指定已存在的证书名称,Certbot将更新现有证书。否则,将创建新证书并为其指定指定的名称。
的--force-renewal
,--duplicate
和--expand
选项控制Certbot的行为重新创建具有相同名称作为现有证书证书时。如果您未指定请求的行为,Certbot可能会询问您的意图。
--force-renewal
告知Certbot请求与现有证书具有相同域的新证书。必须通过明确指定每个域-d
。如果成功,此证书将与之前的证书一起保存,并且live
将更新符号链接(引用)以指向新证书。这是续订特定个人证书的有效方法。
--duplicate
告诉Certbot使用与现有证书相同的域创建单独的,不相关的证书。此证书与前一个证书完全分开保存。大多数用户在正常情况下不需要发出此命令。
--expand
告知Certbot使用包含所有旧域和一个或多个其他新域的新证书更新现有证书。使用该--expand
选项,使用该-d
选项指定所有现有域和一个或多个新域。
例:
1 | certbot --expand -d existing.com,example.com,newdomain.com |
如果您愿意,可以单独指定域,如下所示:
1 | certbot --expand -d existing.com -d example.com -d newdomain.com |
考虑使用--cert-name
而不是--expand
,因为它可以更好地控制修改哪个证书,并允许您删除域以及添加域。
--allow-subset-of-names
如果只能获得某些指定的域授权,则告知Certbot继续生成证书。如果证书中指定的某些域不再指向此系统,这可能很有用。
每当您以上述任何方式获得新证书时,新证书与以前获得的任何证书一起存在,无论以前的证书是否已过期。产生对多种速率限制新的证书数目是旨在防止ACME协议的滥用,如所描述的 在这里。
更改证书的域名
--cert-name
通过使用-d
or --domains
标志指定新域,该标志还可用于修改证书包含的域。如果证书example.com
以前包含example.com
和www.example.com
,它可被修改以仅包含example.com
通过仅指定example.com
与-d
或--domains
标志。例:
1 | certbot certonly --cert-name example.com -d example.com |
以上操作删除了www.example.com
可以使用相同的格式来扩展证书包含的域集,或者完全替换该集:
1 | certbot certonly --cert-name example.com -d example.com example.org,www.example.org |
以上操作删除了www.example.com
,添加了www.example.org
和example.org
。
撤销证书
如果您的帐户密钥已被盗用或者您需要撤销证书,请使用该revoke
命令执行此操作。请注意,该revoke
命令采用证书路径(以结尾cert.pem
),而不是证书名称或域。例:
1 | certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem |
您还可以使用该reason
标志指定撤消证书的原因。原因包括:unspecified
这是默认的,以及keycompromise
, affiliationchanged
,superseded
,和cessationofoperation
:
1 | certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem --reason keycompromise |
此外,如果证书是通过--staging
or --test-cert
标志获得的测试证书,则该标志必须传递给 revoke
子命令。撤销证书后(或其他证书管理任务),可以使用delete
子命令从系统中删除所有证书的相关文件:
1 | certbot delete --cert-name example.com |