无 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 解析,从而实现域名鉴权工作。
acme.sh 使用方法
acme.sh 安装
安装方法参考 acme.sh 中文文档
为了方便大家,我照搬过来。
安装很简单, 一个命令:
1 | curl https://get.acme.sh | sh |
普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:
- 把 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
登录云服务器管理控制台。
单击页面顶部的 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
1 | $ export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" |
- 执行 acme.sh 命令申请证书
注:example.com 为阿里云申请的域名
1 | ./acme.sh --issue --dns dns_ali -d example.com |
申请完毕后可以到 ~/.acme.sh/example.com
查看你的证书
1 | nero@debian:~/.acme.sh/example.com$ ls -al |
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 | $ docker run --rm \ |
这一步有时候是因为 https://acme-v01.api.letsencrypt.org
无法访问导致报错,这时候可以尝试多几次,回显输出 Sleep 120 seconds for the txt records to take effect
的时候,就证明正在设置 txt
解析,等120秒解析生效就可以申请证书下来了。
2. 已守护进程方式运行 acme.sh 容器
1 | $ docker run --name acme.sh \ |
至此 acme.sh 证书到60天就会自动更新。