如何申请自己的免费ssl证书 – 简单通用的自动化脚本 acme.sh

一、前言

本文使用acme.sh达成ssl证书的自动化申请、部署。acme.sh是纯shell script,兼容性极强,涵盖各类桌面linux发行版、windows、macos,甚至是嵌入式系统,如OpenWrt,Asuswrt,群晖的Synology Diskstation等等。支持的CA也从最早的只有Let’s Encrypt,扩展增加了ZeroSSL等数家,并且兼容 RFC8555-compliant CA。并且自动化部署也非常方便,文档也非常完善,从nginx、apache的自动部署,到openwrt、synology nas的自动部署都有文档教程。官方的wiki非常全面,本文仅仅是对一个简单流程的快速介绍,方便新用户快速入门。详细的细节还请参考官方wiki

二、安装

默认安装至 /root/.acme.sh 中,使用curl或者wget可快速安装:

curl:

wget:

其中email=my@example.com输入自己的邮箱,作为向CA申请证书时候的用户标识。

细节参见:https://github.com/acmesh-official/acme.sh/wiki/How-to-install

接下来将默认使用的CA改为Let’s Encrypt:

支持的CA列表详见:https://github.com/acmesh-official/acme.sh/wiki/Server

三、域名验证方式

向CA申请证书需要验证域名。主要有两种方式,一种是acme challenge,另一种是DNS验证。

acme-challenge需要在申请域名的特定目录下放一个特定的网页文件,来验证你是整个域名的所有者。而DNS验证就是向申请域名添加一个特定的TXT记录来验证。

DNS验证相对灵活,可以直接申请该域名下的各种子域名。但需要有该域名的DNS管理权限。而且如果想要实现自动化流程,DNS服务提供着需要提供相应的DNS 管理API来允许自动化工具增删TXT记录。acme.sh安装目录下的dnsapi目录中存储了很多dns api脚本,支持很多家的DNS自动化验证,如cloudflare, dnspod等等,非常多。如果你使用DNS服务商受acme.sh支持,则非常推荐使用该方式申请证书。

相对的,acme-challenge验证就相对不那么自由,需要在申请域名下运行一个web server来验证。acme.sh有两种方式实现。一种是webroot模式,适合于当前主机已经运行了一个现有的web server,acme.sh只需指定站点web root的位置,acme.sh会在申请证书是自动向站点内放入相应的文件用于验证,并在验证完成后移除。。另一种则是standalone模式,适合于当前主机没有运行web server的情况,acme.sh会拉起一个独立的web server(需要安装socat)用于验证。

四、使用DNS API申请证书

使用DNS API来验证域名并申请证书时,需要配置DNS服务商的API认证码。以DNSimple为例。

在DNSimple的账户设置中,xxx中选择生成一个token,拷贝这个token,假如是”sdfsdfsdfljlbjkljlkjsdfoiwje”,申请证书步骤如下(加上–ecc命令可申请ecc证书):

生成一次后,会将key记录到 ~/.acme.sh/account.conf 中,下次直接issue这证书即可。

如果需要申请泛域名证书,可以这样:

这样可以确保主域名和子域名都申请上。

 

五、自动化部署到nginx

todo

六、群晖上的自动化部署

群晖没有crontab,需要增加–nocron参数才能安装。

这里的步骤参考了官方步骤:https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide

不过官方步骤安装到了 /usr/local/share/acme.sh 目录下,而不是默认的 /root/.acme.sh ,这会导致后续每次运行时候都需要指定参数 --home /usr/local/share/acme.sh ,有点麻烦,建议还是安装到默认的 /root/.acme.sh 位置:

接下来还是和上面一样的步骤来申请证书。部署证书到DSM的步骤如下:

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

请输入验证码 *