利用acme.sh申请 Letsencrypt 免费 SSL 证书

无 80 端口申请 Letsencrypt 免费 SSL 证书

从 2018年1月份开始 letsencrypt 支持泛域名了,这让我们部署各种 WEB 应用省了很多功夫,终于不需要维护多个子域名的证书更新,直接使用泛域名证书就好了。

泛域名:*.example.com 这样的域名,就是泛域名。

acme.sh

另向大家浓重介绍由国人利用 shell 脚本开发的 acme.sh 脚本,这脚本使用方便,兼容各种 Linux 系统。他本身就是一个 shell 脚本,仅仅依赖 curlacme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书。

acme.sh 支持 '--webroot', '--standalone', '--apache', '--nginx' or '--dns' 5种证书申请模式,熟悉 certbot 的朋友对前面两种一定不陌生。

使用详情可以看acme.sh 中文文档

作为家庭部署 WEB SSL 业务来说,面临最大的问题就是没有 80 端口,这令申请证书尤为困难。而 acme.sh 最后一种申请证书模式 --dns 模式,它支持 41 个域名商的 API,可以实现全自动利用 API 来生成 dns txt 解析,从而实现域名鉴权工作。

参阅 How to use DNS API

acme.sh 使用方法

acme.sh 安装

安装方法参考 acme.sh 中文文档

为了方便大家,我照搬过来。

安装很简单, 一个命令:

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

普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:

  1. 把 acme.sh 安装到你的 home 目录下:
1
~/.acme.sh/

并创建 一个 bash 的 alias, 方便你的使用: acme.sh=~/.acme.sh/acme.sh

2). 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.

更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install

安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/

acme.sh 生成证书

这里我只列举 --dns 的使用方法。

这边我用阿里云作为例子。

1.前往阿里云申请 Access keys

  1. 登录云服务器管理控制台

  2. 单击页面顶部的 Access Keys,或直接单击 Access Keys 管理控制台

aliyun_access_keys-01

  1. 创建您的 Access Key。

aliyun_access_keys-02

Access Key IDAccess Key Secret 记录下来待会备用。

2.使用 acme.sh --dns 模块获取 Letsencrypt 证书

  1. 首先录入阿里云的 Access Key IDAccess Key Secret 到环境变量。

注:这里假设我在上一步中获得的 Access Key ID= sdfsdfsdfljlbjkljlkjsdfoiwje,Access Key Secret = jlsdflanljkljlfdsaklkjflsa

1
2
$ export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
$ export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
  1. 执行 acme.sh 命令申请证书

注:example.com 为阿里云申请的域名

1
acme.sh --issue --dns dns_ali -d example.com

申请完毕后可以到 ~/.acme.sh/example.com 查看你的证书

1
2
3
4
5
6
7
8
9
10
11
12
13
nero@debian:~/.acme.sh/example.com$ ls -al
.
..
ca.cer
chain.pem -> ca.cer
fullchain.cer
fullchain.pem -> fullchain.cer
example.com.cer
example.com.conf
example.com.csr
example.com.csr.conf
example.com.key
privkey.pem -> example.com.key

Docker 使用 acme.sh

acme.sh 作者做了个 13M的容器 neilpang/acme.sh

docker 使用起来比上面更简单。

Pull 镜像

1
$ docker pull neilpang/acme.sh

创建 acme.sh 证书保存目录

因为要将 acme.sh 的证书保存在本地方便操作,所以需要建立一个目录保存证书。

1
$ mkdir ~/acme.sh

运行 acme.sh 容器

1. 申请证书

注1:这里假设我在阿里云中获得的 Access Key ID= sdfsdfsdfljlbjkljlkjsdfoiwje,Access Key Secret = jlsdflanljkljlfdsaklkjflsa
注2:example.com 为阿里云申请的域名

1
2
3
4
5
$ docker run --rm \
-v ~/acme.sh:/acme.sh \
-e Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" \
-e Ali_Secret="jlsdflanljkljlfdsaklkjflsa" \
neilpang/acme.sh --issue --dns dns_ali -d example.com

这一步有时候是因为 https://acme-v01.api.letsencrypt.org 无法访问导致报错,这时候可以尝试多几次,回显输出 Sleep 120 seconds for the txt records to take effect 的时候,就证明正在设置 txt 解析,等120秒解析生效就可以申请证书下来了。

2. 已守护进程方式运行 acme.sh 容器

1
2
3
4
$ docker run --name acme.sh \
-d --restart unless-stopped \
-v ~/acme.sh:/acme.sh \
neilpang/acme.sh daemon

至此 acme.sh 证书到60天就会自动更新。