利用acme.sh启用https的一点记录
较早之前,去年11月,本博客网站启用过一次 https,那次是按照官方教程( https://certbot.eff.org/ )一步一步来操作实践的。今年1月底,离证书到期还有应该不到30天,执行crontab命令出错(后来发现是自己把crontab里的命令写错了,把 certbot 错打成了 cerbot ,典型的低级错误),导致证书不匹配(见 SSL故障导致网站不能访问 ),网站不能访问,临时又取消了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, 每天定点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。
安装结束,重启终端,才能使别名生效。
三、生成证书
acme.sh 实现了 acme 协议支持的所有验证协议。一般有两种方式验证: http 和 dns 验证。我最终用的是http 方式。
(一)http 方式验证
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用。
acme.sh --issue -d pich.yiwan.org -w /home/litanid/litanid_WWW/LiTaTu/
参数 -w 后面指定的是网站根目录,-d 后面指定的是网站绑定的域名。执行后,终端会显示:
| |
再运行
| |
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, 都是免费的. 然后:
证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了. 直接生成就好了:
acme.sh --issue -d mydomain2.com --dns dns_dp
一点小知识:生成的证书放在 /etc/letsencrypt/live/[网站域名]下,一般有以下几个文件:
一般情况下 fullchain.pem 和 privkey.pem 就够用了。
四、安装证书
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方。
注意,默认生成的证书都放在安装目录下:~/.acme.sh/, 请不要直接使用此目录下的文件, 例如:不要直接让 nginx/apache 的配置文件使用这下面的文件。 这里面的文件都是内部使用,而且目录结构可能会变化。
正确的使用方法是使用 –installcert 命令,并指定目标位置,然后证书文件会被copy到相应的位置。例如:
| |
一个小提醒,这里用的是 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的一些命令:
七、后续操作
以上生成安装证书后,得要在apache2上修改网站配置文件及网站必要设置后才能正式启用,具体配置见另文。