使用https连接到具有由我创建的CA签名的证书的服务器

时间:2012-02-07 11:08:15

标签: ruby ssl https ssl-certificate

我有一个使用Ruby通过https连接驱动服务器的测试环境。由于最新版本的Ruby拒绝连接到具有无效证书的https服务器(请参阅this earlier question of mine),并且我想开始使用更新版本的Ruby,我正在尝试设置有效的证书。

我创建了一个要使用的CA证书(有多个服务器正在测试,所以这似乎更容易),并已成功使用它来签署已安装在服务器上并正在使用的新证书。我已将CA证书添加到浏览器商店,它(浏览器)现在将连接到服务器而无需投诉。所以我相信我的证书是有效的并且设置正确。

我知道Ruby不会使用与浏览器相同的商店。我使用了可用的CA文件here来测试连接到其他(公共)服务器(使用Net::HTTP#ca_file=方法设置),这也有效。

我无法工作的是Ruby使用我的证书连接到我的服务器。我已经尝试了各种方法将它指向我的证书(包括将我的证书添加到上面链接的文件)并且它总是给出相同的错误:

SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A (OpenSSL::SSL::SSLError)

如何说服Ruby接受我的证书并连接到我的服务器?

我使用的代码是:

require 'net/https'

uri = URI.parse("https://hostname/index.html")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_file = "My CA cert file"
request = Net::HTTP::Get.new(uri.path)
response = http.request(request)

我认为这是错误的。我想知道的是,我该怎么做才能使用我的CA证书?

3 个答案:

答案 0 :(得分:20)

我假设您的Tomcat不喜欢Ruby尝试协商的协议版本。 Ruby默认使用SSLv23,但我听说过其他情况,这对基于Java的Web服务器来说是一个问题。您收到的错误消息表示在设置连接并尝试读取服务器响应时握手失败。尝试添加

http.ssl_version = :TLSv1

http.ssl_version = :SSLv3

看看这是否有帮助。

如果这还没有解决问题,那么了解服务器拒绝连接尝试的原因会非常有趣。尝试使用-Djavax.net.debug=ssl运行Tomcat,并发布相关部分(连接信息,异常堆栈跟踪)以了解尝试失败的原因。

答案 1 :(得分:2)

我使用ruby 1.9.3并在使用nokogiri解析一些安全网址时遇到了同样的错误。

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: (null)

浮雕提供的上述答案是正确的,但请确保生成的ssl错误是上面提到的错误。我已经按照相同的方式找到了如下所述的解决方案。

uri = URI(url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.ssl_version = :SSLv3
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
response = http.get(url)

现在响应是为安全网址解析了正确的html,该网址传递给网址中的代码。

答案 2 :(得分:0)

确保您的证书文件是PEM格式,而不是CRT(因此documentation for Net::HTTP in Ruby 1.9.3表示)。

更新看起来文档不是最新的,Ruby 1.9.3将接受任何类型的证书。