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

标签 ruby ssl https ssl-certificate

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

我已经创建了一个 CA 证书来使用(有多个服务器正在测试,所以这似乎是更简单的方法),并且已经成功地使用它来签署一个已安装在服务器上并正在使用的新证书。我已将 CA 证书添加到浏览器商店,它(浏览器)现在将毫无怨言地连接到服务器。因此,我确信我的证书有效且设置正确。

我知道 Ruby 不使用与浏览器相同的商店。我使用了可用的 CA 文件 here测试连接到其他(公共(public))服务器(使用 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 证书?

最佳答案

我假设您的 Tomcat 不喜欢 Ruby 尝试协商的协议(protocol)版本。 ruby 使用 SSLv23默认情况下,但我听说过其他情况,这是基于 Java 的 Web 服务器的问题。您收到的错误消息表明在建立连接和尝试读取服务器响应时握手失败。尝试添加其中之一

http.ssl_version = :TLSv1

http.ssl_version = :SSLv3

看看这是否有帮助。

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

关于ruby - 使用 https 连接到具有由我创建的 CA 签名的证书的服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9175151/

相关文章:

python - pip安装中文服务器ssl错误

在 Windows Phone 8 模拟器上找不到 SSL 证书

amazon-web-services - 通过 ACM 在 AWS 上的单实例 tomcat 上配置 SSL 证书

ruby - 无法启动 Ruby Thin 命令

ruby - 如何在不运行脚本的情况下对 ruby​​ 脚本中的函数进行单元测试

ruby-on-rails - ruby rails : Generate HTML for each file in a folder

ios - Swift 2 - kCFStreamErrorDomainSSL,-9813 使用 ssl

python - 在带有 Google Cloud 服务的 Python 中使用多处理时出现 SSL 错误

ruby-on-rails - 测试委托(delegate)给另一个对象的方法

git 克隆 https/ssl 错误