有多少人正真知道 amce challenge 的区别?

1 月 26 日
 jianglibo

let'sencrypt 发行证书支持的验证方式有:

  1. DNS-01
  2. HTTP-01
  3. TLS-ALPN-01

其中 DNS-01 可通过 CNAME 省去设置 apikey 和 secret ,当然前提至少有一个域名是可以修改记录 programmatically.

有些 http 服务器支持自动更新证书,知道是怎么实现的吗?

其实 nginx 和 haproxy 也可以轻易实现自动更新。是的,L4 级别的监听即可,不要 terminator TLS 就可以区分是否来自 acme challenge 。

测试每一种 challenge

3944 次点击
所在节点    程序员
36 条回复
holulu
1 月 26 日
http 服务器在 http://<YOUR_DOMAIN>/.well-known/acme-challenge 路径返回 challenge token 。
jianglibo
1 月 26 日
@holulu http ( HTTP-01)可以直接复用端口,但是 https 呢?
diudiuu
1 月 26 日
一般用这个 HTTP-01 去做,就是一楼说的那样
有些基于 acme 做的,是先检查 DNS-01 ,如果不行再检查 HTTP-01 ,正式环境都有错误限制,最好在测试环境的上做
totoro625
1 月 26 日
DNS-01 是一种,直接修改 DNS 的 TXT 记录,且支持 CNAME ,比较适合一个证书里面多个域名进行批量申请
HTTP-01 和 TLS-ALPN-01 是同一种,需要通过域名的解析记录进行实际访问,分别对应 80 端口和 443 端口

比如需要预申请证书,就得用 DNS-01
如果是已经在运行的服务器需要申请证书,可以用 HTTP-01 和 TLS-ALPN-01 申请正在运行的服务端的证书
DejavuMoe
1 月 26 日
只有 DNS-01 支持通配符
jianglibo
1 月 26 日
@DejavuMoe 是的,这个概念很重要。如果深入思考的话,只有 DNS-01 支持是必然的。IP 证书,或者 http-01 ,tls-alpn-01 都只能确定单个 hostname 。
jianglibo
1 月 26 日
@diudiuu ‘有些基于 acme 做的’这个表述说明你还不是很清楚这个问题,需要继续思考。
diudiuu
1 月 26 日
@jianglibo
github.com/go-acme/lego/v4/lego

这个,用的 HTTP-01 去做的申请,但是每次都会先检查 DNS-01 这个,具体没有细究。
我觉得你的问题点就是后面已经申请证书的怎么去更新维护,到底是走 http 还是 https ,目前我是两个端口 80 443 都保留,虽然不是很优雅.
qwx
1 月 26 日
不是咱挑刺啊,是 acme 不是 amce……
jianglibo
1 月 26 日
@qwx sorry,typo. 我改一下。
caola
1 月 26 日
DNS 验证不用说你应该都知道了吧,至于 HTTP-01 其实和 TLS-ALPN-01 差不多的,只是一个是文件验证,一个是 TLS 握手阶段进行协商密钥签名验证,为此我在前两年就用 go 语言专门写过对应的服务端(实现自动化)和客户端验证(提交 ACME 前自己先预检一次)。

AD: 欢迎使用我的网站 草啦 SSL ( https://cao.la )进行手动申请免费证书。
cccer
1 月 26 日
nginx 只支持不停机 HTTP-01 ,用 TLS-ALPN-01 必须停机一段时间将 443 端口用 stream 转发到 acme 客户端。

另外一个新的 challenge 预计今年内可以上线 DNS-PERSIST-01 ,手动在 DNS 记录配置一个公钥可以无限次续签通配符证书,从而使 acme 不需要去修改 dns 记录。
jianglibo
1 月 26 日
@diudiuu 为了便于你理解,我简化描述一下流程。你:请给 xxx.xx.com 签发证书,acme server: 给你一个它支持的 challenges 列表,比如 http-01,dns-01...。 你:请使用 http-01 验证,acme server: 好的,我就用 http-01 验证,它不会去遍历所有的 candicates 。
jianglibo
1 月 26 日
@cccer 不用停机,你可以做到,给你一个提示 steam ,你访问我提到的网站,我保证你可以成功不停机自动更新 nginx 和 haproxy ,我自己的网站就是这么做的啊。
jianglibo
1 月 26 日
@cccer 又是一个 typo ,stream.
stream {
map $ssl_preread_alpn_protocols $stream_backend {
~*acme-tls/1 127.0.0.1:9443;
default 127.0.0.1:8443;
}

server {
listen 443;
listen [::]:443;
proxy_pass $stream_backend;
ssl_preread on;
}
}
holulu
1 月 26 日
@jianglibo acme 只会访问 80 端口,如果你的服务器跳转 443 ,acme 应该会 follow ,并且忽略证书验证,只检查 http body 里的 challenge token
jianglibo
1 月 26 日
@holulu 你在说什么呀,至少先问问 AI 再发表这种外行的言论.
diudiuu
1 月 26 日
@jianglibo 你把我弄蒙了,我看你啥都知道么。
cccer
1 月 26 日
@jianglibo 学到了,原来可以用 ssl_preread_alpn_protocols 区分 ssl 流量
jianglibo
1 月 26 日
@caola 我尝试了一下:
域名:
_acme-challenge.www.cao.la
验证值:
oX2rQVj7mBB4dXND2MglxPlGNSLlyucOsN7JlPPMpj0
说明只支持 CNAME 验证,无法申请 IP 证书, 如何自动更新也是个问题,除非有 agent 。有 agent 的话,就可以在验证开始时自动 spin up 一个监听器,结束后解除监听。可以完成所有的自动化过程,比如将证书合并,haproxy 需要将 pem 和 key 合并到一个文件。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1188270

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX