临时处理OCSP域名无法访问的问题
注意:本文最后更新于 1614 天前,有关的内容可能已经发生变化,请参考使用。
之前的文章有提到过OCSP,现在本站用的 SSL 证书换成了 Let's Encrypt ,近期由于众所周知的原因,国内无法直接访问 Let's Encrypt 的 OSCP 域名,导致出现了不能签发证书、OCSP Stapling 失败、网页打开慢等问题。
经检查目前是 ocsp.int-x3.letsencrypt.org 的 cname 域名 a771.dscq.akamai.net 受到了干扰,可以采用本地修改hosts的方案进行临时处理。
在/etc/hosts中添加
23.32.3.72 ocsp.int-x3.letsencrypt.org
获取 OCSP 响应
openssl ocsp -no_nonce \
-respout /path/to/certs/holmesian.org/ocsp_res.der \
-issuer /path/to/certs/holmesian.org/ca.cer \
-cert /path/to/certs/holmesian.org/holmesian.org.cer \
-url http://ocsp.int-x3.letsencrypt.org/ \
-header "HOST" "ocsp.int-x3.letsencrypt.org"
-cert 、 -issuer 、 -CAfile 分别对应的是子证书、中间证书、根证书,其实全部使用 acme.sh 文件夹中的 fullchain.cer 也是可以的。
-respout 是 OCSP 响应保存位置,将这个位置填入在 nginx 配置文件的 ssl_stapling_file 中,如下开启ssl_stapling。
这里如果出现如下错误的话,说明你的openssl使用了1.1.0版本,这个时候已经不需要指定HOST,把上面命令中的“-header "HOST" "ocsp.int-x3.letsencrypt.org"”删掉就好了。
Missing = in header key=value
ocsp: Use -help for summary.
ssl_stapling on;
ssl_stapling_verify on;
ssl_stapling_file /root/.acme.sh/*.holmesian.org_ecc/ocsp_res.der;
重载nginx服务之后,检查是否成功开启。
openssl s_client -connect holmesian.org:443 -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
最后将有关操作制成脚本,添加到 crontab 中自动更新。
「倘若有所帮助,不妨酌情赞赏!」
感谢您的支持!
使用微信扫描二维码完成支付
首先,感谢大佬的文章,我用这个文章提到的OCSP的ip,完美的解决了问题。
但是,我的解决方案,跟大佬稍有不同,就是改完hosts,直接运行证书续期命令:
https://iymark.com/website/letsencrypt-ocsp-success.html
我把自己的过程写出来了,给大家做下参考
由衷的感谢您
@古哥
其实还可以通过修改证书中OCSP地址到自己反代的OCSP服务解决这个问题。
感谢,问题解决了。
这个获取 OCSP 响应,有效期多久?需要定时多长时间刷新呢?刷新 OCSP 响应后,nginx 是否需要 reload?不过还是有两个问题需要问一下站长:
@Lx
需要reload的。
写脚本太麻烦。直接把resolver改成127.0.0.53。hosts里面写好真实IP映射。前提是你本地DNS默认用systemd-resolved,比如Ubuntu 20
你好, 我是按照上面的步骤, 执行 openssl ocsp -no_nonce 。。。, 用的 acme.sh 生成的 fullchain.cer ,会报错,Responder Error: unauthorize(6), 这是什么原因导致的
@John
检查一下证书是否过期
打开这个网站 ssl 连接耗时还是有 3 秒
@Joy
这个3秒不是OCSP的锅,详情看这个 https://holmesian.org/Haproxy-distinguishes-flow-characteristics
你好, 我是使用 acme.sh 这个工具, 生成的 LE 证书.
按照上面的步骤,
openssl ocsp ...
此时, 会报如下的错误:
Response Verify Failure
OCSP routines:OCSP_basic_verify:signer certificate not found:ocsp_vfy.c:92:
找到了另一篇文章: (评论不让发链接....)
在文章的最后说:
"如果证书 OCSP Response 没有包含 Certificate 信息,例如 COMODO、Let's Encrypt 家的部分证书"
因为Letsencrypt 的证书中没有Certificate信息. 所以无法得到 OCSP Response
是这样的吗?
@easyfrog
RFC 2560 (https://tools.ietf.org/html/rfc2560)里载明了:一个 Basic OCSP Response 包含
tbsResponseData ResponseData, signatureAlgorithm AlgorithmIdentifier, signature BIT STRING, certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL这几项信息,所谓的 Certificate 信息指的应该就是这个可选的 certs 字段,Let's encrypt 的 OCSP 服务返回的Basic OCSP Response 确实不含 Certificate 信息,可以简单的认为这个Certificate 信息包含能够验证OCSP Response签名的信息,没有提供且本地又没有指定可信证书链的情况下就会出现 signer certificate not found 这个错误提示,表示无法验证OCSP Response的真伪。
解决方法也也很简单:1、指定本地可信证书链;2、忽略验证直接进行 OCSP 装订(Nginx对待没有 Certificate 信息又没有设置 ssl_trusted_certificate 的 OCSP Response 就是这么干的)
@Holmesian
嗯. 我又找到了一个方法. 就是 再加入一个 -verify_other path/to/chain.pem 这样也可以通过验证.
112233测试
不是很明白,最近也遇到这个问题了
nginx 上设置ssl_stapling 就可以解决的意思是吗?
网站是对外服务的,改hosts 不现实
@sunny
服务器上改 Hosts 之后就可以获取 OCSP 响应,然后将 OCSP 响应通过 nginx 的 ssl_stapling 功能打包发给客户端,客户端即使不能访问访问 Let's Encrypt 的 OSCP 域名也不会受到影响啦。
完美!看了一圈都是转发消息说 OSCP 不能用的,也没个解决方案。
我猜一下马上就有很多雷同的文章了 2333