利用acme.sh从Let’sEncrypt生成免费的证书

有些朋友可能会问,生成免费证书的方法很多,为什么还需要使用acme.sh,简单的说就是,多一项技能多一个选择,另外,Docker申请Let’s Encrypt可以使用acme.sh非常方便!

acme.sh实现了acme协议,可以从letsencrypt生成免费的证书。

主要步骤:

  1. 安装acme.sh
  2. 生成证书
  3. 复制证书到 nginx/apache 或者其他服务

1.安装acme.sh

安装很简单,一个命令:

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

2.生成证书

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

1. http方式需要在你的网站根目录下放置一个文件,来验证的现场实现,完成验证。那么就可以生成证书了。

acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  /home/wwwroot/mydomain.com/

只需要指定域名,并指定域名所在的网站根目录。acme.sh会根的生成验证文件,并准备接下来网站的目录,自动完成验证。并删除验证文件。

如果你用的apache服务器,acme.sh还可以智能的从apache的配置中自动完成验证,你不需要指定网站根目录:

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

如果你用的nginx服务器、反代、acme.sh还可以智能的从nginx的配置中自动完成验证,你不需要指定网站根目录:

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

PS:虽然可以智能配置apache和nginx,但还是推荐手动配置,以免影响其他在运行的网站!

2.手动dns方式,手动在域名上添加一条txt解析记录,验证域名解析。

此方式的优点是,无需任何网络服务,无需任何公用网络ip,只需要dns的解析记录完成验证。坏处是,如果不同时配置自动DNS API,使用这种方式acme.sh将无法自动更新证书,每次都需要手动重新解析解析域名解析。

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

3. 复制/安装证书

前面的证书申请好以后,接下来需要把证书复制到配置里。

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

正确的使用方法是使用--install-cert命令,并指定了目标位置,然后证书文件会被复制到相应的位置,例如:

阿帕奇示例:

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"

Nginx 示例:

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"

Nginx 的配置ssl_certificate使用/etc/nginx/ssl/fullchain.cer,而不是/etc/nginx/ssl/<domain>.cer,否则SSL Labs的测试会报告Chain issues Incomplete错误。

安装使用就到这里,有朋友会问,如果证书到期怎么更新?

目前,acme.sh会在证书 60 天以后自动更新,无需任何操作!