【发布时间】:2016-07-17 23:03:29
【问题描述】:
我正在使用 Mechanize 抓取网站并收到与主机名不匹配相关的错误。我发现问题的根源是我正在抓取的网站上使用了 SNI,我想指定主机名以确保使用正确的证书。
这是我目前的设置:
agent = Mechanize.new
agent.user_agent = custom_user_agent
agent.verify_mode = OpenSSL::SSL::VERIFY_PEER
page = agent.get "website.com"
这是我认为我需要添加的内容(或类似的内容)以确保使用正确的证书:
OpenSSL::SSL::SSLSocket.hostname = "website.com"
这可以在 Mechanize 中完成吗,还是我需要弄清楚如何手动指定要使用的证书?
就上下文而言,我知道VERIFY_NONE 解决方案,但考虑到它引入的漏洞,我更愿意避免使用它。
【问题讨论】:
-
OpenSSL 1.0.2 及以下版本不 执行主机名匹配。应用程序,如 cURL 和 Mechanize,必须执行匹配。 OpenSSL 1.1.0 is scheduled to implement it。如果您遇到主机名匹配问题,那么此时肯定来自 Mechanize。 SNI 是 TLS 功能,因此请确保您使用的是 TLS 1.0 或更高版本。我猜你的问题是 Mecahanize(或 Ruby)not 使用 SNI。
-
@jww 似乎没有办法在 Mechanize 中设置它。您是否知道支持 SNI 的方法或替代 Mechanize 的方法?
-
可能相关(我不是 Ruby 或 Mechanize 开发人员):How to set TLS context options in Ruby (like OpenSSL::SSL::SSL_OP_NO_SSLv2) 和 OpenSSL::SSL::SSLError: hostname does not match the server certificate。需要调用的 OpenSSL 函数是
SSL_set_tlsext_host_name,但我不清楚 Ruby 是否/何时调用它。 -
@jww 看起来主机名需要在 Net::HTTP 中设置(一个 gem Mechanize 依赖),但似乎没有办法将它作为参数传递给 Mechanize .