本帖最后由 neroxps 于 2018-5-30 15:27 编辑
无 80 端口申请 Letsencrypt 免费 SSL 证书
从 2018年1月份开始 letsencrypt 支持泛域名了,这让我们部署各种 WEB 应用省了很多功夫,终于不需要维护多个子域名的证书更新,直接使用泛域名证书就好了。
泛域名:*.example.com 这样的域名,就是泛域名。
acme.sh
另向大家浓重介绍由国人利用 shell 脚本开发的 acme.sh 脚本,这脚本使用方便,兼容各种 Linux 系统。他本身就是一个 shell 脚本,仅仅依赖 curl ,acme.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 中文文档
为了方便大家,我照搬过来。
安装很简单, 一个命令:
curl https://get.acme.sh | sh
普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:
- 把 acme.sh 安装到你的 home 目录下:
~/.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
-
登录云服务器管理控制台。
-
单击页面顶部的 Access Keys,或直接单击 Access Keys 管理控制台。
- 创建您的 Access Key。
将 Access Key ID 和 Access Key Secret 记录下来待会备用。
2.使用 acme.sh --dns 模块获取 Letsencrypt 证书
- 首先录入阿里云的
Access Key ID 和 Access Key Secret 到环境变量。
注:这里假设我在上一步中获得的 Access Key ID = sdfsdfsdfljlbjkljlkjsdfoiwje ,Access Key Secret = jlsdflanljkljlfdsaklkjflsa
$ export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
$ export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
- 执行 acme.sh 命令申请证书
注:example.com 为阿里云申请的域名
acme.sh --issue --dns dns_ali -d example.com
申请完毕后可以到 ~/.acme.sh/example.com 查看你的证书
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 镜像
$ docker pull neilpang/acme.sh
创建 acme.sh 证书保存目录
因为要将 acme.sh 的证书保存在本地方便操作,所以需要建立一个目录保存证书。
$ mkdir ~/acme.sh
运行 acme.sh 容器
1. 申请证书
注1:这里假设我在阿里云中获得的 Access Key ID = sdfsdfsdfljlbjkljlkjsdfoiwje ,Access Key Secret = jlsdflanljkljlfdsaklkjflsa
注2:example.com 为阿里云申请的域名
$ 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 容器
$ docker run --name acme.sh \
-d --restart unless-stopped \
-v ~/acme.sh:/acme.sh \
neilpang/acme.sh daemon
至此 acme.sh 证书到60天就会自动更新。
|