Ruby/Mechanize应对Let's Encrypt根证书过期OpenSSL 1.0.2报错咨询
你之前的代码报错是因为X509_VERIFY_PARAM_set_flags是OpenSSL原生C接口,Ruby的OpenSSL绑定没有直接暴露该全局方法,也没有提前定义X509_V_FLAG_TRUSTED_FIRST常量,所以会触发未初始化常量的报错。
可通过以下代码实现兼容,全程保留证书校验、无需修改系统信任存储库:
Mechanize 场景适配(你当前使用的框架)
require 'mechanize' require 'openssl' agent = Mechanize.new # 0x80000 对应X509_V_FLAG_TRUSTED_FIRST的固定常量值 agent.ssl_config.verify_flags |= 0x80000 # 强制开启证书校验,无需设置为VERIFY_NONE agent.verify_mode = OpenSSL::SSL::VERIFY_PEER
原生Net::HTTP 场景适配
如果使用Ruby内置的Net::HTTP,可使用以下配置:
require 'net/http' require 'openssl' uri = URI('https://目标站点域名') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_PEER # 添加TRUSTED_FIRST标识,优先信任系统内置的有效ISRG根证书 http.verify_flags |= 0x80000
兼容逻辑说明
- 0x80000是
X509_V_FLAG_TRUSTED_FIRST的固定数值,所有OpenSSL 1.0.2及以上版本均支持该标识,不需要依赖Ruby绑定暴露对应常量 - 开启该标识后,OpenSSL会优先匹配系统信任库中已存在的、有效的ISRG Root X1(Let's Encrypt新根证书),忽略已过期的DST Root CA X3旧根证书的校验错误
- 全程保持证书完整性、合法性校验,无安全风险,符合合规要求
内容的提问来源于stack exchange,提问作者stargazer
相关产品推荐
相关产品推荐

