- 安装 acme.sh
安装过程需要服务器已安装 socat 模块,它是一个多功能的网络小工具。
dnf install socat -y
通过下面命令安装 acme.sh ,Email 用来接收重要重要通知,如证书快到期未更新会收到通知。
curl https://get.acme.sh | sh -s email=自己的邮箱
执行命令后几秒就安装好了,如果半天没有反应请 Ctrl+C 后重新执行命令。acme.sh 安装在 ~/.acme.sh 目录下,并自动创建了一个 cronjob,每天 0:00 点自动检测所有的证书,如果快过期了, 则会自动更新。
- 生成证书
acme.sh 实现了 acme 协议支持的所有验证协议,一般有三种验证方式:HTTP 方式、手动 DNS 方式和 DNS API 方式。推荐使用 DNS API 方式。
HTTP 方式
HTTP 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权以完成验证,然后就可以生成证书了。
acme.sh --issue -d example.com(域名) --webroot /path/to/example.com/
acme.sh 会自动的生成验证文件,并放到网站的根目录,然后自动完成验证,最后会自动删除验证文件。
如果你用的 Nginx 服务器,acme.sh 还可以智能的从 Nginx 的配置中自动完成验证,你不需要指定网站根目录。
acme.sh --issue -d example.com --nginx
注意,HTTP 验证方式不支持生成泛域名证书。
手动 DNS 方式
这种方式需要手动在域名上添加一条 TXT 解析记录,验证域名所有权。这种方式的好处是, 你不需要任何服务器,不需要任何公网 IP,只需要 DNS 的解析记录即可完成验证。
执行以下命令进行手动 DNS 验证:
acme.sh --issue -d example.com -d "*.example.com" --dns \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
到 DNS 解析中,新增一条 TXT 记录,域名前缀为 _acme-challenge,记录值为终端输出的 TXT value 的值。然后再次执行:
acme.sh --renew -d example.com -d "*.example.com" \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
注意:这种方式的坏处是,如果不同时配置 DNS API,将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
webroot方式(推荐方式)
创建验证目录
mkdir -p /usr/local/nginx/html/acme/example.com/.well-known
echo "example.com" > /usr/local/nginx/html/acme/example.com/.well-known/test.html
webroot方式生成证书需要在对应服务80端口下配置需指定root目录和.well-known,具体代码如下:
root 目录也可以指定到项目下(比如web项目)
root index.html;
location /.well-known/ {
root html/acme/example.com/;
}
执行命令重新加载nginx配置文件
nginx -t
nginx -s reload
测试访问连接 此处有问题可以看一下解析,必须到外网,查看返回结果如果上上述中echo “example.com” > /usr/local/nginx/html/acme/example.com/.well-known/test.html中的内容那么此处已经成功
curl http://example.com/.well-known/test.html
执行命令申请生成证书,等待打印结果,如果没问题会提示你的证书存放位置
/root/.acme.sh/acme.sh --issue -d example.com --webroot /usr/local/nginx/html/acme/example.com --log
部署 安装证书到nginx,根据自己实景情况运行以下命令
/root/.acme.sh/acme.sh --install-cert -d example.com \
--key-file /etc/nginx/conf/cert/lincense/example.com.key \
--fullchain-file /etc/nginx/conf/cert/lincense/example.com_fullchain.cer \
--reloadcmd "nginx -s reload"
泛域名证书申请
DNS API 方式
自动 DNS 验证方式需要使用域名解析服务商的 DNS API,像腾讯云(DNSPos)和阿里云都提供 DNS API 功能。
如果你用的是腾讯云 DNSPod,在右上角头像下拉中选择“API 密钥”,点击“DNSPos Token”创建密钥
如果你用的是阿里云,在右上角头像下拉中选择“AccessKey 管理”,创建密钥
创建好密钥后,使用如下命令把它们的 Id 和 Token 或 Secret 放到环境变量中:
**# 腾讯云**
export DP_Id="YourId"
export DP_Key="YourToken"
**# 阿里云**
export Ali_Key="YourAccessKeyId"
export Ali_Secret="YourAccessKeySecret"
再通过下面命令生成证书:
腾讯云
acme.sh --issue --dns dns_dp -d example.com -d *.example.com
阿里云
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
注意:这里第一个域名为顶级域名,后面一个为泛域名。这种方式将自动为你的域名添加一条 TXT 解析,验证成功后,这条解析记录会被删除,对你来说是无感的。如果使用一段时间后发现没有自动申请证书,并且手动申请提示没有添加TXT解析值,大概率的问题是accesskey需要重新加载到环境变量。
证书生成成功后,默认保存在 ~/.acme.sh/example.com/ 目录中。请不要直接使用 ~/.acme.sh/ 目录下的文件,这里面的文件都是内部使用的,而且目录结构可能会变化,我们需要把证书复制到需要用的地方去同上webroot方式部署安装证书。