2024 HTTPS 免费SSL证书 acme.sh DNS 全自动申请 Let's Encrypt ZeroSSL
2024-05-06
阅读 {{counts.readCount}}
评论 {{counts.commentCount}}
## 前言
啰嗦两句背景介绍
<br>
一直以来免费SSL证书最好的选择就两个
1. 类似`Let's Encrypt`、`ZeroSSL`这类免费证书机构,期限3个月,支持通配符证书
2. `亚洲诚信/TrustAsia`的1年免费单域名证书(阿里云、腾讯云的免费证书都是这家提供的)
<br>
![](/api/file/getImage?fileId=6682169ec0a657000b009cfa)
![](/api/file/getImage?fileId=6682169ec0a657000b009cf7)
<br>
**他俩的区别是:**
`通配符证书`可以给所有主域名+子域名用,比如申请一张*.baidu.com的通配符证书,所有www.baidu.com tieba.baidu.com image.baidu.com music.baidu.com 等都可以共用。哪怕你有20个子域名也只需要申请一张。
<br>
`单域名证书`之前的政策是1年只要申请1次,缺点是一张证书只能匹配一个域名,如果你有20个子域名,那连主域名,总共要申请21张,手动申请,手动配置,费时费力。
<br>
那么为什么单域名这么麻烦还有人选择用TrustAsia的单域名证书呢?
<br>
因为`Let's Encrypt`也有问题,首先他只给3个月,对比TrustAsia每年只忙一次。其次2020年Let's Encrypt出现过一次致命问题,Safari浏览器访问巨慢,原因是OSCP域名被DNS污染(被墙),而苹果系的浏览器会强制客户端联网验证OSCP,用户看到的画面就是打开网址,白屏10秒,再开始加载网页,体验极差。解决方案也有,就是`OCSP Stapling`,后文会细说。
<br><br>
BUT!最新消息是
**2024年4月,由于上游TrustAsia原因,全网取消了1年的免费单域名证书,改为3个月。**
<br>
那么如果我有20个子域名,我将会累死在电脑前面,无奈,又要改回`Let's Encrypt ZeroSSL`方案。
<br>
本文就简单概述下 **2024年如何高效的申请和配置`Let's Encrypt ZeroSSL`的通配符证书**
<br><br>
PS: (一些无关紧要的补充)
`亚洲诚信/TrustAsia`旗下的SSL安全验证网站 [https://myssl.com/](https://myssl.com/) 会把`Let's Encrypt`的证书列为 `不安全`,你品,你细品。
对比另一个全球公认的SSL安全验证网站[https://www.ssllabs.com](https://www.ssllabs.com)认为`Let's Encrypt`是安全的
<br><br>
## 折腾
首先大方向肯定是人越是轻松越好,争取脚本全自动更新
这里选择全自动脚本
[https://github.com/acmesh-official/acme.sh](https://github.com/acmesh-official/acme.sh)
<br>
官方文档里的 `Supported CA`
可以看到他支持自动申请哪些机构的证书
我这里选择默认的ZeroSSL
因为Letsencrypt可能会被某些可能无良的测评说不安全
<br>
>Supported CA
ZeroSSL.com CA(default)
Letsencrypt.org CA
BuyPass.com CA
SSL.com CA
Google.com Public CA
Pebble strict Mode
Any other RFC8555-compliant CA
---
<br>
准备工作0 安装过程
参考官方教程里的这一段
https://github.com/acmesh-official/acme.sh/wiki/Install-in-China
由于原版的shell中会连 `https://raw.githubusercontent.com/` 导致下载失败
大陆地区用gitee方案 可以快速直连 注意邮箱地址改成你自己的
```shell
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
```
---
<br>
**准备工作1 DNS自动配置权限申请**
<br>
全自动申请有2个方案
1. HTTP方式是通过Apache/Nginx映射目录,放文件,来证明你对域名的所有权
2. DNS方式是通过修改DNS配置来证明对域名的所有权
<br>
我这里选择DNS,因为网上查到的教程都在用这个,我懒得研究,照搬,一次跑通
<br>
我这里是以腾讯云为例的,你需要找到你的域名提供商,并拿到授权的key
<br>
腾讯云申请地址:
[https://console.dnspod.cn/account/token/token](https://console.dnspod.cn/account/token/token)
<br>
阿里云申请地址:
[https://ram.console.aliyun.com/users](https://ram.console.aliyun.com/users)
<br>
配置目录 `/root/.acme.sh/dnsapi/dns_xxx.sh`
(官方文档推荐是修改Linux环境变量来赋值Key和Secret 我这里简单粗暴直接shell文件了)
<br>
阿里云修改 `dns_ali.sh`
```shell
#!/usr/bin/bash
Ali_API="https://alidns.aliyuncs.com/"
Ali_Key="xxxxxxxxxx"
Ali_Secret="xxxxxxxxxxxxxxxxxxxxxxxxx"
#Usage: dns_ali_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_ali_add() {
...
}
```
<br>
腾讯云修改`dns_dp.sh`
```shell
#!/usr/bin/bash
# Dnspod.cn Domain api
DP_Id="1234567890"
DP_Key="xxxxxxxxxxxxxxxxxxxxxxxxxxx"
REST_API="https://dnsapi.cn"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_dp_add() {
...
}
```
---
<br>
**准备工作2 注册ZeroSSL**
https://app.zerossl.com/developer
注册zerossl
点击Generate
记录`eab-kid`和`eab-hmac-key`
<br>
**正式开始**
```shell
# 进入目录
cd /root/.acme.sh
# 注册账号
# 切记这里的key要改成你自己的!
./acme.sh --register-account --server zerossl --eab-kid xxx --eab-hmac-key xxx
```
```shell
# 自动DNS dnspod 多域名 自定义输出目录
# 切记这里域名要改成你自己的!
# 切记这里的目录 /path/to/certfile/in/apache/ 要改成你自己的,确保文件夹存在!
./acme.sh --issue --dns dns_dp -d zzzmh.cn -d *.zzzmh.cn \
--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 \
```
**成功后配置nginx**
`nginx.conf`
```shell
server {
listen 443 ssl http2 default_server;
server_name zzzmh.cn;
# 证书部分
ssl_certificate /path/to/certfile/in/apache/fullchain.pem;
ssl_certificate_key /path/to/certfile/in/apache/key.pem;
# TLS 握手优化
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
keepalive_timeout 75s;
keepalive_requests 100;
# TLS 版本控制
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# ocsp
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/certfile/in/apache/fullchain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;
location / {
...
}
}
```
**这里需要注意ssl_certificate要配置fullchain.pem**
如果配置cert.pem也可以跑通,但是会出现如下错误,据说微信小程序的请求也会报错!
```shell
降级原因:
1. 证书链不完整,降级为B,具体详情可参考《缺少证书链的问题和解决办法》。
```
**关于OCSP必须开启,否则苹果系设备用Safari访问会卡白屏10秒以上**
## 最终效果
<br>
**MYSSL**
![](/api/file/getImage?fileId=6682169ec0a657000b009cf6)
![](/api/file/getImage?fileId=6682169ec0a657000b009cf5)
<br>
**SSLLAB**
(这里只得B评分,是因为他家认为保留TLS1.0和1.1协议是不安全的,我个人认为应该逐步取消支持,否则老设备用户将无法访问。)
![](/api/file/getImage?fileId=6682169ec0a657000b009cf9)
![](/api/file/getImage?fileId=6682169ec0a657000b009cf8)
<br><br>
## 遗留问题
1. 无法开启TLS1.3,调查后发现可能是系统openssl版本问题,下一篇文章细说
2. ZeroSSL网页客户端看不到CA证书,这个我暂时还没解决
<br><br>
## END
参考
[https://github.com/acmesh-official/acme.sh](https://github.com/acmesh-official/acme.sh)
[https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert](https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert)
[https://www.jianshu.com/p/e60eb0514953](https://www.jianshu.com/p/e60eb0514953)
[https://blog.csdn.net/zhangxin09/article/details/125062975](https://blog.csdn.net/zhangxin09/article/details/125062975)
[https://blog.csdn.net/yedajiang44/article/details/121173526](https://blog.csdn.net/yedajiang44/article/details/121173526)
[https://blog.csdn.net/liuweilhy/article/details/134751175](https://blog.csdn.net/liuweilhy/article/details/134751175)