无垠之码

深度剖析代码之道


免费https证书的申请

提到免费https证书,就不得不提ACME协议。ACME(Automatic Certificate Management Environment)是一种用于自动管理HTTPS证书的开放协议,其追求自动化HTTPS证书的申请、颁发、续期和撤销,无需人工干预,通过API进行证书的创建、验证和更新,使用HTTP-01、DNS-01、TLS-ALPN-01验证域名所有权,自动化管理证书的生命周期,避免证书过期。

需要注意的是,通过ACME协议申请的证书有效期统一为90天,这种短期有效的设计更符合现代安全最佳实践。值得一提的是,随着技术发展,部分新型HTTP服务器(如Caddy)已内置ACME协议支持,开发者无需借助额外工具即可实现HTTPS证书的自动化管理,这大大降低了HTTPS的部署门槛。

HTTP-01:

这是当今最常见的验证方式。Let’s Encrypt向ACME客户端提供一个令牌,然后用户需要替换Web服务器http://<你的域名>/.well-known/acme-challenge/TOKEN(用提供的令牌替换TOKEN)路径上放置的指定文件。该文件包含令牌以及帐户密钥的指纹。一旦ACME客户端告诉Let’s Encrypt文件已准备就绪,Let’s Encrypt会尝试获取它(可能从多个地点进行多次尝试)。该方式不支持颁发通配符证书。

DNS-01:

此验证方式要求用户在该域名下的TXT记录中放置特定值来证明控制域名的DNS系统。该配置比HTTP-01略困难,但可以在某些HTTP-01不可用的情况下工作,同时允许您颁发通配符证书。Let’s Encrypt为用户的ACME客户端提供令牌后,用户需要将令牌记录放在 _acme-challenge.<YOUR_DOMAIN>下,然后Let’s Encrypt将向DNS系统查询该记录。

TLS-ALPN-01:

此验证方式客户端(Caddy)向ACME服务器(如 Let’s Encrypt)发起证书申请,服务器指定TLS-ALPN-01挑战类型,并提供一个挑战值(token),客户端需要响应这个挑战。客户端在443端口启动一个临时的TLS服务器,并使用ALPN扩展指定acme-tls/1协议。客户端使用token和授权信息生成一个特殊的自签名证书,作为TLS服务器的证书。ACME服务器尝试通过TLS-ALPN-01连接目标域的443端口,并检查客户端提供的自签名证书。(Caddy默认通过TLS-ALPN-01验证进行自动证书管理)

1.certbot


Let’s Encrypt是一个受信任的证书颁发机构CA,它由非营利组织Internet Security Research Group (ISRG)运营,旨在推动HTTPS的普及,通过自动化流程为网站提供免费的数字证书(DV 类型),其根证书(ISRG Root X1)已被所有主流操作系统、浏览器和设备的信任库预置,这里本文介绍的certbot是Let’s Encrypt官方推荐的证书申请工具。

certbot功能十分强大,本人但受限于部署条件,同时域名托管于cloudflare等因素,故使用certbot-dns-cloudflare插件实现自动证书申请与续期。

sudo apt-get install certbot python3-certbot-dns-cloudflare python-certbot-dns-cloudflare-doc
certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini -d test.diyao.me

certbot-dns-cloudflare插件的用法,可参见python-certbot-dns-cloudflare-doc文档

最后需要将certbot加入crontab中完成证书的自动续期

0 0 1 * *  /usr/bin/certbot renew --quiet

2.acme.sh


acme.sh是使用纯SHELL脚本编写的acme协议的客户端协议实现,无任何库或软件依赖。支持椭圆曲线加密的ECDSA类型证书,支持SAN(Subject Alternative Name)和通配符证书(一张SAN证书或通配符证书可以保护多域名)。

curl https://get.acme.sh | sh
acme.sh --register-account -m 530384671@qq.com

本文使用的DNS-01验证,针对市面大多数的域名托管商acme.sh都支持,比如aliyun,华为云等。当然acme.sh亦支持使用HTTP-01验证方式

acme.sh --issue --dns dns_cf -d test.diyao.me
acme.sh --issue --standalone -d test.diyao.me

通过–server参数,可以选择不同的免费CA证书颁发机构。目前,acme.sh支持以下CA:Let’s Encrypt、Buypass、ZeroSSL、SSL.com和Google。相较于certbot,acme.sh自动安装crontab完成证书的续期。

注意:

  1. ssl.com目前需要绑定信用卡信息
  2. google需要使用参考文档4申请对应的eab信息
  3. 此两种ca要求申请命令中增加eab-kid和eab-hmac-key参数

3.参考文献

  1. https://docs.diyao.me/docs/python3-certbot-dns-cloudflare/html/
  2. https://github.com/acmesh-official/acme.sh/wiki/dnsapi
  3. https://github.com/acmesh-official/acme.sh/wiki/Server
  4. https://cloud.google.com/certificate-manager/docs/public-ca-tutorial?hl=zh-cn
comments powered by Disqus