使用acme.sh配置letsencrypt证书

越来越多的人开始意识到 https 的重要性了,letsencrypt 证书免费而且兼容性好。在一般情况下都足够用。如果需要更高级别的证书可以考虑付费的。

首先,我这里的需求是前端有两台 web 服务器,前端有一台作为均衡负载。所以常规的使用域名作为验证的方法是不可行的,在看 acme.sh 时发现了它支持使用 DNS 作为验证。满足了我的要求。

安装

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

安装完后 acme.sh 会被安装在~/.acme.sh 的目录下面.

dns认证

在安装目录的 dnsapi 目录下面 README.md 有认证方式,我使用了 dnspod 作为 dns 服务。在 dnspod 控制台申请到 id 和key后,在当前目录执行:

1
2
3
4
5
6
7
export DP_Id="1111"
export DP_Key="111111111111111"
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com

acme.sh --issue --dns dns_dp -d aaa.net -d *.aaa.net #泛域名支持


会在 .acme.sh 目录生成一个以域名为目录的证书目录

1
2
3
4
5
[Tue Mar 21 15:51:00 CST 2017] Your cert is in  /home/pprt/.acme.sh/<domain>/<domain>.cer
[Tue Mar 21 15:51:00 CST 2017] Your cert key is in /home/pprt/.acme.sh/<domain>/<domain>.key
[Tue Mar 21 15:51:01 CST 2017] The intermediate CA cert is in /home/pprt/.acme.sh/<domain>/ca.cer
[Tue Mar 21 15:51:01 CST 2017] And the full chain certs is there: /home/pprt/.acme.sh/<domain>/fullchain.cer

部署

acme.sh 提供了一个接口用来部署证书,也就是我们需要将生成的证书拷贝到指定的服务器,实例如下

1
2
acme.sh --deploy -d example.com --deploy-hook cpanel

服务器上使用了 ansible 作为管理 所以需要将文件使用 ansible 复制到其他机器上指定的文件夹

在 deploy 文件夹下面 创建一个 ansible.sh 的文件,里面添加如下代码,将文件拷贝到指定的服务器。
其中 _cert_dir 为服务器上保存证书的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ansible_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"

_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"

_cert_dir=/Code/sslCert/

ansible olweb -m file -a "path=$_cert_dir/$c_domain state=directory " --become
ansible olweb -m copy -a "src=$_cfullchain dest=$_cert_dir/$_cdomain/cert.cer"
ansible olweb -m copy -a "src=$_ckey dest=$_cert_dir/$_cdomain/cert.key"
ansible olweb -m command -a "service openresty force-reload" --become
# _err "deploy cert to nginx server, Not implemented yet"
return 0

}


在执行deploy后,会制动添加一个 crontab

1
2
33 0 * * * "/home/pprt/.acme.sh"/acme.sh --cron   --home "/home/pprt/.acme.sh" > /dev/null

如果设置有多个域名,只会部署第一个,需要在crontab添加一个-f的参数

参考

acme.sh github

acme.sh wiki

acme.sh dnsapi

acme.sh deploy

作者

张巍

发布于

2017-03-22

更新于

2017-03-22

许可协议

评论