安装 Let’s Encrypt 客户端
对于 CentOS 发行版来说目前有两种安装 Let’s Encrypt 客户端的方式,一种是从上游的 EPEL 源直接 yum 安装,一种是从 Let’s Encrypt 的 GitHub 源下载。水景一页使用的是下面的第二种方法,从 GitHub 下载。
两种安装方式
简单比较:
YUM 安装可跟随系统更新一起更新该安装包,但是没有 apache 自动安装证书的这个组件,安装过程非常简单。
git 安装也很简单,有 apache 插件,但是需要另行升级更新。并且需要该虚拟主机已经配置了 SSL 证书(自己签发的也行)。
目前 EPEL 源中已经有了 letsencrypt 安装包,但是这个安装包还没有整合 Apache 组件。这就意味着该客户端只能获取证书,还不能自动为网站安装证书(其实安装证书也就是修改虚拟主机配置文件,将其中的指向安全证书的路径替换为当前获取的 Let’s Encrypt CA 证书)。
但是这个 Apache 插件在 Let’s Encrypt 的 GitHub 源里面已经是有了的。所以我们有两种方案来操作:一是获取 GitHub 上的 Let’s Encrypt 客户端,然后自动获取和安装证书;二是从 EPEL 源上直接安装 letsencrypt 包,仅获取证书,手工安装证书。
使用不包含 apache 插件的 letsencrypt 是不太方便的。因为这里的 letsencrypt 没有 Apache 插件,只能使用 certonly 或者 standalone 模式获取证书。而因为获取的证书需要立即进行验证,也就是验证所申请的证书与对应域名的一致性,可是因为不能自动安装证书,所以需要把 certonly 模式获取的证书放在对应虚拟主机的网站根目录让 Let’s Encrypt 验证服务器可以访问到。该目录在 Linux 上还是个以 . 开头的隐藏目录,需要设置 Apache 服务器以允许访问隐藏目录内的内容。看起来似乎也是挺麻烦的。standalone 模式似乎更麻烦,可能还需要让虚拟主机暂停一下服务。由于当前存在这些问题,所以水景一页选择的是使用 GitHub 上的 Let’s Encrypt 客户端以减少麻烦(自带可执行文件,无须编译安装)。
注意:使用客户端获取和安装证书后其会自动极短暂地重启 Apache 服务以使证书生效!
从 EPEL 安装 LET’S ENCRYPT
既然是整合好的安装包,那么就非常简单了(其实下一种方法也很简单,只是没法通过 YUM 升级)。目前 EPEL 官方源里面已经整合了 Let’s Encrypt 的安装包了。如果系统里使用了 EPEL 的源的话,直接 YUM 安装即可。不过再安装一次 EPEL 源也不麻烦。
# yum install epel-release
# yum install letsencrypt
运行,
# letsencrypt --help
可以查看帮助。还能看到提示说当前还没有集成 Apache 插件。这就意味着该客户端只能获取证书,还不能自动为网站安装证书。
可以尝试使用 apache 组件获取证书并安装。执行,
# letsencrypt --apache -d 111cn.net -d www.111cn.net -d test.111cn.net
The requested apache plugin does not appear to be installed
No installers are available on your OS yet; try running "letsencrypt-auto certonly" to get a cert you can install manually
GIT 安装
安装服务器依赖组件,因为要用 git 嘛,
# yum install epel-release
# yum install git
然后下载 Let’s Encrypt 客户端,也就是从 GitHub 上复制该源的所有文件,
# git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
上面的指令中最后的目录表示将程序保存到本地的 /opt/letsencrypt 文件夹。
如果需要更新客户端,可以通过下面的指令更新之,
# cd /opt/letsencrypt
# sudo git pull
当然也可以把这个指令加到下面要介绍的自动更新证书的脚本里面自动执行。
调整虚拟主机配置文件
先不慌着运行客户端来获取证书,还有些准备工作要做。使用 apache 自动安装证书插件有以下前提需要满足才能成功,
需要该虚拟主机已经配置了 SSL 证书(自己签发的也行)。如果需要安装一个自己签发的证书,可以参考水景一页上的这篇文章。
需要一个虚拟主机单独一个 Apache 配置文件(.conf 文件)。
如果像水景一页一样没有使用分离的配置文件,可以按照下面的思路修改配置文件。因为如果服务器的 SSL 配置文件中有几个虚拟主机,letsencrypt 运行时会提示错误,
“We were unable to find a vhost with ServerName or Address of 111cn.net
然后让你选择有效的配置文件。
假设原来的服务器上虚拟主机的配置文件在 vhostssl.conf 文件中。
新建文件夹,
mkdir /etc/httpd/sites-available
mkdir /etc/httpd/sites-enabled
将 vhostssl.conf 文件中每个虚拟主机单独用一个针对 SSL 的配置文件,例如 111cn.net-ssl.conf 和 test.111cn.net-ssl.conf,保存在 sites-available 文件夹中。同时删除 vhostssl.conf 文件中的对应内容。
然后针对要启用的主机的配置文件建立软连接到 sites-enabled 文件夹中,比如这里的 111cn.net,
ln -s /etc/httpd/sites-available/111cn.net-ssl.conf /etc/httpd/sites-enabled/111cn.net-ssl.conf
这样的好处是,如果不需要 111cn.net-ssl.conf 了,直接删除 sites-enabled 文件夹中的该项,而 sites-available 中还保留着原始配置文件作为备份。
然后在 vhostssl.conf 中添加下面的一行指令以让 Apache 启动时加载 sites-enabled 文件夹中的所有虚拟主机配置文件,
IncludeOptional sites-enabled/*.conf
嗯,如果是 Apache 2.4 之前的版本,应该用,
Include sites-enabled/*.conf
准备好之后就可以进入 letsencrypt 安装目录执行证书的获取和启用了。
获取及安装证书
这里以 git 安装的 letsencrypt 为例。
进入 letsencrypt 文件夹,比如这里的,
# cd /opt/letsencrypt
运行以下指令,
# ./letsencrypt --apache -d 111cn.net -d www.111cn.net -d test.111cn.net
其中 --apache 表示使用 apache 插件安装证书;每个需要安装证书的域名都跟在一个 -d 后面。一般对于主域名,如这里的 111cn.net,通常我们会将 www.111cn.net 作为其别名同时申请证书。也就是说,至少包含类似于上面的三个域名中的前两个。当然也可以分开申请证书,比如,
先进行,
# ./letsencrypt --apache -d 111cn.net -d www.111cn.net
完成后再执行,
# ./letsencrypt --apache -d test.111cn.net
第一次运行会自动安装一些必须的软件包,包括 python 相关的内容。下载量大约是 20-30MB。之后就会自动获取证书并安装。
前面说过,apache 插件目前只能处理一个虚拟主机单独一个配置文件的配置方式。比如这里提到的三个域名对应两个虚拟主机,111cn.net 和 www.111cn.net 对应主站;test.111cn.net 是另一个独立的网站。那么就需要将这两个虚拟主机的 vhost 配置文件分别写成两个独立的文件,比如 111cn.net-ssl.conf 和 test.111cn.net-ssl.conf。否则会触发错误而导致失败。错误类似于,
The apache plugin is not working; there may be problems with your existing configuration.
The error was: PluginError(('There has been an error in parsing the file (%s): %s', u'/etc/httpd/conf.d/vhost.conf', u'Syntax error'),)
当然,修改虚拟主机配置文件后重新运行就可以了。下面接着说正确的路子。
然后紧接着就会提示输入管理帐号的 email 地址。再就是同意协议。很简单,除了 email 地址要输入,剩下的就是一路 Enter 就可以了。
1. email for recovery of account credentials
2. Agrement
申请下来的证书会被保存在 /etc/letsencrypt/live/ 文件夹。
定时更新证书
注意:下面是按照 git 安装的情况来说明的,如果是 yum 安装,则需要根据情况调整 letsencrypt 指令。
Let’s Encrypt 证书的有效期是 90 天。但是因为流程是全自动的,所以也不会造成多大麻烦。官方说明中强调所有证书只要过了 60 天就可以换发新的证书,以留出一些时间用于应付突发情况。
对于自动更新脚本,官方则建议最好每天运行一次,并且是在一天中随机的某个时刻,这样可以避免每次更新时都遇到特定的网络状况、服务器拥堵等问题,也就尽可能避免了连续多天无法获取新证书的情况出现。
自动续期的命令为,
# ./letsencrypt-auto renew
该指令会自动更新服务器上所有通过该方法获取的证书。
官方给了一个自动更新脚本作为例子,下面是针对使用 apache 插件的自动续约脚本。按照前面的情况,假设安装位置为 /opt/letsencrypt。
#!/bin/sh
if ! /opt/letsencrypt/letsencrypt-auto renew > /var/log/letsencrypt/renew.log 2>&1 ; then
echo Automated renewal failed:
cat /var/log/letsencrypt/renew.log
exit 1
fi
将其保存为 le-renew.sh 文件,然后可以通过 cron 定时运行该文件。
下面是水景一页使用的自动化脚本,前面添加了一个自动延迟几分钟的指令以避免总在某一个特定时刻更新,并ie如果更新失败则会自动向指定的邮件地址发送邮件提醒。
#!/bin/sh
# https://111cn.net/
# 自动更新 letsencrypt 客户端
cd /opt/letsencrypt
git pull
# 延时随机的分钟数
sleep $[ ( $RANDOM % 10 ) + 1 ]m
# 自动续签 Let's Encrypt 证书
cd /opt/letsencrypt
if ! ./letsencrypt-auto renew > /var/log/letsencrypt/renew.log 2>&1 ; then
echo Automated renewal failed: | mail -s "LE renew failed" your@email.com
cat /var/log/letsencrypt/renew.log
exit 1
fi
设置脚本自动执行前要自己先直接运行试试看有没有错误,是否达到预期效果。
要设置该脚本自动运行,比如每天凌晨 5 点钟执行,则直接以 root 身份修改 crontab 文件即可,在其最后添加如下一行并保存即可,
0 5 * * * root sh /path/to/le-renew.sh > /dev/null 2>&1
注意修改到 le-renew.sh 的路径 :D