如何在不关闭SSL验证的前提下爬取网站,解决证书验证失败问题
问题根源
从curl测试结果可直接定位错误原因:目标网站的SSL证书已过期,默认的SSL校验流程会拦截不符合有效性要求的请求,和你的Ruby代码逻辑无关。
解决方案(均不关闭SSL全局验证)
场景1:你可控制目标网站配置
- 直接为目标域名申请并部署新的有效SSL证书即可,证书生效后删除原有代码中的
ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE配置,即可正常运行。
场景2:你无法修改目标网站的证书配置
这种场景下要通过SSL校验,只需单独信任该目标网站的过期证书即可,不会影响其他站点的SSL验证逻辑,操作步骤如下:
- 导出目标网站的证书文件,执行命令:
openssl s_client -connect mywebsiteurl.com:443 -servername mywebsiteurl.com < /dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > mywebsite.crt - 修改Ruby代码,指定校验时使用你导出的证书:
require 'httparty' require 'nokogiri' require 'open-uri' require 'openssl' # 替换为你导出的证书文件实际路径 cert_store = OpenSSL::X509::Store.new cert_store.add_file('/path/to/your/mywebsite.crt') page = open("https://mywebsiteurl.com", ssl_cert_store: cert_store) doc = Nokogiri::HTML(page) puts doc
提示:该方案仅针对单个目标站点信任其证书,不会全局关闭SSL验证,安全性远高于直接关闭SSL校验。仅建议你确认目标站点可信时使用该方案,陌生站点手动信任过期证书存在安全风险。
内容的提问来源于stack exchange,提问作者SkRoR
相关产品推荐
相关产品推荐

