前言
acme.sh 实现了 acme
协议, 可以从 letsencrypt 生成免费的证书。
安装 acme.sh
安装很简单, 一个命令,它会执行以下操作,更高级的安装选项请参考文档:
curl https://get.acme.sh
- 把文件解压到
~/.acme.sh
下 - 创建一个
shell
的alias
,例如.bashrc
,方便你的使用:alias acme.sh=~/.acme.sh/acme.sh
- 注册一个
cronjob
来自动检测并更新证书
安装完成后要自行重启命令行,或重新加载.bashrc
文件(source ~/.bashrc
)。
安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/
签发证书
通过 acme.sh 可以签发单域名、多域名、泛域名证书,还可以签发 ECC 证书。
acme.sh 实现了 acme 协议支持的所有验证协议。一般有两种方式验证: HTTP
和DNS
验证。
HTTP方式
这种方式会自动在网站根目录下放置一个文件,来验证你的域名所有权。完成验证后自动删除。
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
只需要指定域名和域名所在的网站根目录即可。可添加多个-d
从而指定多个域名。
使用不同方式签发不同域名:
acme.sh --issue -d example.com --dns dns_cf -d -d www.example.com --nginx
acme.sh
还可以智能的从配置中自动完成验证,你不需要指定网站根目录:
acme.sh --issue -d mydomain.com --apache
acme.sh --issue -d mydomain.com --nginx /etc/nginx/nginx.conf //手动指定Nginx配置文件或网站配置文件
注意:无论是Apache还是Nginx模式,
acme.sh
在完成验证之后,会恢复到之前的状态。不会更改你的配置。
如果你没有安装HTTP
服务器,acme.sh
也可以临时建立服务器签发证书:
acme.sh --issue -d mydomain.com --standalone --httpport 80
acme.sh --issue -d mydomain.com --alpn --tlsport 443
可使用
--httpport
手动指定HTTP端口,使用--tlsport
手动指定TLS端口
更高级的用法请参考文档
DNS方式
这种方式只需要DNS
解析记录即可完成验证:
acme.sh --issue --dns -d mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
然后会生成相应的解析记录,只需要在你的域名管理面板中添加这条TXT
记录即可。
等待解析完成之后,重新生成证书:
acme.sh --renew -d mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
如果不同时配置
Automatic DNS API
,使用这种方式将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
DNS API方式
DNS方式的真正强大之处在于可以使用域名解析商提供的API自动添加TXT
记录。
以DNSPod为例,需要生成并使用你的API ID
和API Key
,然后导入密钥:
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
再以CloudFlare为例,获取API Key
和Token
,然后导入密钥:
API Key
可以全局也可以区域,区域API Key只需要Zone.DNS
的编辑权限。
export CF_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Account_ID="xxxxxxxxxxxxx"
export CF_Zone_ID="xxxxxxxxxxxxx"
配置信息会保存到~/.acme.sh/account.conf
这个文件里,证书续期时会自动调用。
之后就可以一键签发了:
acme.sh --issue --dns dns_dp -d *.example.com
acme.sh --issue --dns dns_cf -d example.com
使用*进行泛域名签发(只适用于DNS方式)
更详细的API用法请参考文档
签发 ECC 证书
默认签发的都是基于RSA密钥加密的证书,RSA算法应用较早,适用范围广,兼容性更好,但是对服务端性能消耗高。ECC算法是新一代算法趋势主流,加密速度快,效率更高,对服务器资源消耗低,而且最重要的是更安全,抗攻击型更强。长远来看,RSA可能会被ECC取代。所以这里讲一下ECC证书的签发。
只需要添加--keylength/-k
参数,手动指定ec-xxx
算法即可:
acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-384
支持以下长度的证书:
- ec-256 (prime256v1, “ECDSA P-256”)
- ec-384 (secp384r1, “ECDSA P-384”)
- ec-521 (secp521r1, “ECDSA P-521”) //Let’s Encrypt暂不支持
安装证书
acme.sh
默认生成的证书都放在安装目录下,需要使用--install-cert
命令指定位置安装:
注意:请不要直接使用
acme.sh
目录下的文件
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
详细参数请参考文档。这个命令会被记录,在续期时自动调用。
到这里关于acme.sh
的配置就完成了,只需要在 Apache / Nginx
里面指定证书路径就可以使用HTTPS了。