往日微忆
文章目录

较早之前,去年11月,本博客网站启用过一次 https,那次是按照官方教程( https://certbot.eff.org/)一步一步来操作实践的。今年1月底,离证书到期还有应该不到30天,执行crontab命令出错(后来发现是自己把crontab里的命令写错了,把 certbot 错打成了 cerbot ,典型的低级错误),导致证书不匹配(见 https://www.yiwan.pro/index.php/ltd_documents/306-ssl-make-this-blog-404.html),网站不能访问,临时又取消了https访问。那时浏览器地址栏安全锁标志是带感叹号的,不是纯粹的绿锁,那是因为网站引用了很多 http 资源,主要是图片。如今,网站图片问题解决,自己建立图床,自己部署 https(也是使用 acme.sh),所以本博客网站再次启用 https,估计以后都不会取消了。这次启用,采用的是 acme.sh,全程自动化,不用担心证书续签问题。以下是本人的操作记录:

一、官网

其实官网的 README.md 已经写得非常详细(以下大部分内容也是摘自官方说明文档),大家依葫芦画瓢即可。

二、下载安装

虽然官方说明里写了普通用户和root用户安装使用都没问题,但我发现 crontab 里的命令估计没有 root 权限执行不了,为了避免错误,还是以 root 用户操作为好(以下命令都是用 root 用户操作)。

进入root用户,运行

curl https://get.acme.sh | sh

Or:

wget -O - https://get.acme.sh | sh

安装过程进行了以下三个步骤(注意看安装终端提示):

1.把 acme.sh 安装到用户目录 ($HOME): ~/.acme.sh/ . 我用的是 root 用户,程序默认安装到/root/下。安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: /root/.acme.sh/。

2.创建了一个bash的别名: acme.sh=~/.acme.sh/acme.sh ,之后只要在终端输入执行acme.sh即可。

3.自动创建cron job, 每天定点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。

[email protected]:~# crontab -l
9 0 * * * "/home/litanid/.acme.sh"/acme.sh --cron --home "/home/litanid/.acme.sh" > /dev/null

安装结束,重启终端,才能使别名生效。

三、生成证书

acme.sh 实现了 acme 协议支持的所有验证协议。一般有两种方式验证: http 和 dns 验证。我最终用的是http 方式。

(一)http 方式验证

只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用。

acme.sh --issue -d pich.yiwan.pro -w /home/litanid/litanid_WWW/LiTaTu/

参数 -w 后面指定的是网站根目录,-d 后面指定的是网站绑定的域名。执行后,终端会显示:

[Thu Apr 13 16:10:40 CST 2017]Your cert is in /home/litanid/.acme.sh/pich.yiwan.pro/pich.yiwan.pro.cer
[Thu Apr 13 16:10:40 CST 2017] Your cert key is in /home/litanid/.acme.sh/pich.yiwan.pro/pich.yiwan.pro.key
[Thu Apr 13 16:10:41 CST 2017] The intermediate CA cert is in /home/litanid/.acme.sh/pich.yiwan.pro/ca.cer
[Thu Apr 13 16:10:41 CST 2017] And the full chain certs is there: /home/litanid/.acme.sh/pich.yiwan.pro/fullchain.cer

再运行

acme.sh --issue -d www.yiwan.pro -w /home/litanid/litanid_WWW/Yiwan_WordPress/
[Thu Apr 13 16:16:33 CST 2017]Your cert is in /home/litanid/.acme.sh/www.yiwan.pro/www.yiwan.pro.cer
[Thu Apr 13 16:16:33 CST 2017] Your cert key is in /home/litanid/.acme.sh/www.yiwan.pro/www.yiwan.pro.key
[Thu Apr 13 16:16:34 CST 2017] The intermediate CA cert is in /home/litanid/.acme.sh/www.yiwan.pro/ca.cer
[Thu Apr 13 16:16:34 CST 2017] And the full chain certs is there: /home/litanid/.acme.sh/www.yiwan.pro/fullchain.cer
[email protected]:~# acme.sh --list
Main_Domain KeyLength SAN_Domains Created Renew
pich.yiwan.pro "" no Thu Apr 13 08:10:41 UTC 2017 Mon Jun 12 08:10:41 UTC 2017
www.yiwan.pro "" no Thu Apr 13 08:16:34 UTC 2017 Mon Jun 12 08:16:34 UTC 2017

2. dns 方式验证

需在域名上添加一条 txt 解析记录, 验证域名所有权。这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证。

acme.sh --issue --dns -d mydomain.com

然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可。

等待解析完成之后, 重新生成证书:

acme.sh --renew -d mydomain.com

注意第二次这里用的是 –renew

以下是我的操作实践:

dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证。

acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成。

以 dnspod 为例, 你需要先登录到 dnspod 账号, 生成你的 api id 和 api key, 都是免费的. 然后:

export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com

证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了. 直接生成就好了:

acme.sh --issue -d mydomain2.com --dns dns_dp

一点小知识:生成的证书放在 /etc/letsencrypt/live/ [网站域名]下,一般有以下几个文件:

cert.pem       服务端证书
chain.pem      浏览器需要的所有证书但不包括服务端证书,比如根证书和中间证书
fullchain.pem  包括了cert.pem和chain.pem的内容
privkey.pem    证书的私钥

一般情况下 fullchain.pem 和 privkey.pem 就够用了。

四、安装证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方。

注意,默认生成的证书都放在安装目录下:~/.acme.sh/, 请不要直接使用此目录下的文件, 例如:不要直接让 nginx/apache 的配置文件使用这下面的文件。 这里面的文件都是内部使用,而且目录结构可能会变化。

正确的使用方法是使用 –installcert 命令,并指定目标位置,然后证书文件会被copy到相应的位置。例如:

acme.sh --install-cert -d pich.yiwan.pro \
        --cert-file /home/litanid/.ssl/apa-letsencrypt/pich.yiwan.pro/cert.pem \
        --key-file /home/litanid/.ssl/apa-letsencrypt/pich.yiwan.pro/key.pem \
        --fullchain-file /home/litanid/.ssl/apa-letsencrypt/pich.yiwan.pro/fullchain.pem \
        --reloadcmd "service apache2 force-reload"
acme.sh --install-cert -d www.yiwan.pro \
        --cert-file /home/litanid/.ssl/apa-letsencrypt/www.yiwan.pro/cert.pem \
        --key-file /home/litanid/.ssl/apa-letsencrypt/www.yiwan.pro/key.pem \
        --fullchain-file /home/litanid/.ssl/apa-letsencrypt/www.yiwan.pro/fullchain.pem \
        --reloadcmd "/etc/init.d/apache2 force-reload"

一个小提醒,这里用的是 service apache2 force-reload (也可以用/etc/init.d/apache2 force-reload), 不是 service apache2 reload,据测试,reload 并不会重新加载证书,所以用的 force-reload。

–installcert 命令可以携带很多参数来指定目标文件,并且可以指定 reloadcmd,当证书更新以后,reloadcmd会被自动调用,让服务器生效。

值得注意的是,这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后, 被再次自动调用。

五、更新证书

目前证书在 60 天以后会自动更新,你无需任何操作。今后有可能会缩短这个时间,不过都是自动的,你不用关心。

六、更新acme.sh

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新,因此 acme.sh 也经常更新以保持同步。

升级 acme.sh 到最新版 :

acme.sh --upgrade

如果你不想手动升级, 可以开启自动升级:

acme.sh --upgrade --auto-upgrade

之后, acme.sh 就会自动保持更新了.

你也可以随时关闭自动更新:

acme.sh --upgrade --auto-upgrade 0

以下是acme.sh的一些命令:

acme.sh -h 查看帮助
acme.sh --revoke -d domain.com 撤销一个证书
acme.sh --remove -d domain.com 删除一个证书
acme.sh --uninstall 卸载acme.sh

七、后续操作

以上生成安装证书后,得要在apache2上修改网站配置文件及网站必要设置后才能正式启用,具体配置见另文。