机械化和HTTParty中出现“主机名与服务器证书不匹配”的错误

3

有时候,当我使用 HTTPartyMechanize 访问一个网站时,我会遇到这个错误:

hostname "www.example.com" does not match the server certificate

我可以看到如果您使用open方法,那么有一个解决方法,但我不确定如何利用上述宝石。 Mechanize的堆栈跟踪:
agent = Mechanize.new
agent.read_timeout              = 180
agent.open_timeout              = 180
agent.user_agent_alias          = 'Mac Safari'
agent.redirect_ok               = :all
agent.follow_meta_refresh       = :anywhere
agent.follow_meta_refresh_self  = true
agent.get("https://some-domain.com")
/home/me/.rbenv/versions/2.2.2/lib/ruby/2.2.0/openssl/ssl.rb:232:in `post_connection_check'
/home/me/.rbenv/versions/2.2.2/lib/ruby/2.2.0/net/http.rb:925:in `connect'
/home/me/.rbenv/versions/2.2.2/lib/ruby/2.2.0/net/http.rb:863:in `do_start'
/home/me/.rbenv/versions/2.2.2/lib/ruby/2.2.0/net/http.rb:858:in `start'
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:700:in `start'
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:965:in `reset'
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:628:in `connection_for'
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:994:in `request'
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mechanize-2.7.4/lib/mechanize/http/agent.rb:267:in `fetch'
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mechanize-2.7.4/lib/mechanize.rb:464:in `get'

HTTParty 的堆栈跟踪:

HTTParty.get("https://some-domain.com")
/home/me/.rbenv/versions/2.2.2/lib/ruby/2.2.0/openssl/ssl.rb:232:in `post_connection_check'
/home/me/.rbenv/versions/2.2.2/lib/ruby/2.2.0/net/http.rb:925:in `connect'
/home/me/.rbenv/versions/2.2.2/lib/ruby/2.2.0/net/http.rb:863:in `do_start'
/home/me/.rbenv/versions/2.2.2/lib/ruby/2.2.0/net/http.rb:852:in `start'
/home/me/.rbenv/versions/2.2.2/lib/ruby/2.2.0/net/http.rb:1375:in `request'
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/httparty-0.13.7/lib/httparty/request.rb:117:in `perform'
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/httparty-0.13.7/lib/httparty.rb:545:in `perform_request'
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/httparty-0.13.7/lib/httparty.rb:476:in `get'

您应该使用正确的名称创建服务器证书。有关详细信息,请参见如何使用openssl创建自签名证书? - jww
1个回答

4
对于 Mechanize,应将 SSL 验证设置为 none。
agent = Mechanize.new
agent.verify_mode = OpenSSL::SSL::VERIFY_NONE

对于HTTParty,有一个verify:选项。参见这个stackoverflow问题:如何使HTTParty忽略SSL? 如果您想通常设置它,请使用这个不太好的技巧:
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

@jww 是的,当然。但是OP要求解决Mechanize和HTTParty的问题。我已经提供了解决方法。这些只是解决办法,并不是非常清晰和完美的解决方案。有时候问题出在服务器端(而不是客户端),你只能采取解决办法。这并不是downvote的原因,因为我已经提供了OP所要求的内容。希望你能理解我的观点。OP想要设置VERIFY_NONE,我已经回答了。所以请取消downvote。 - Stan Brajewski
@jww,当您不拥有服务器时,无法创建证书。看起来OP在大量抓取,这就是我理解OP问题的方式。 对于我来说,您关于创建证书的评论与OP的问题无关。 因为问题是:我不拥有服务器。存在SSL问题。 我想获取页面!即使每个浏览器允许您在证书有问题时选择“访问网站!”。 您只会收到警告,但仍然可以使用错误的证书获取页面。 - Stan Brajewski
@jww,请为OP发布答案,以便他完成任务。我不知道如何使用您的技术。您能否提供Mechanize和/或HTTParty解决方案来获取带有错误证书的页面?您已经给出了负面评价,请提供更好的解决方案。如果您没有更好的解决方案,那么为什么要给出负面评价呢? - Stan Brajewski
我已经点赞了这个答案,因为它确实回答了问题。显然,修复别人的服务器并不是一个可行的解决方案。在标记答案之前,您可以检查一下 mechanize 方法是否正确。它返回 undefined method http' for #Mechanize:0x007fd711907e38`。 - Cjoerg
是的,应该只是 agent.verify_mode = OpenSSL::SSL::VERIFY_NONE - 我会更正答案。 - Stan Brajewski
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接