2024 HTTPS 免费SSL证书 acme.sh DNS 全自动申请 Let's Encrypt ZeroSSL home 编辑时间 2024/05/06 ![](/api/file/getImage?fileId=6682169ec0a657000b009cfb) <br><br> ## 前言 啰嗦两句背景介绍 <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` ```conf 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) 送人玫瑰,手留余香 赞赏 Wechat Pay Alipay uni-app 入门笔记 HBuilderX Vue3 开发微信小程序 Netty WebSocket 入门