【问题标题】:OpenSSL + Self Signed Cert = OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failedOpenSSL + 自签名证书 = OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
【发布时间】:2013-09-03 12:42:42
【问题描述】:

我一直在尝试为我们的内部 Rails 应用程序使用 SSL (SAN) 证书。

我已经使用 OpenSSL 创建了证书文件,并让它们与 Apache 完美配合:

<VirtualHost *:443>
  ServerName server-name
  RailsEnv uat

  DocumentRoot /var/www/server-name/current/public
  <Directory /var/www/server-name/current/public>
    AllowOverride All
    Options -MultiViews
  </Directory>

  SSLEngine on
  SSLCertificateFile /etc/apache2/ssl/hostname.cer
  SSLCertificateKeyFile /etc/apache2/ssl/hostname.key
</VirtualHost>

这很好用。

我的问题是当使用open-uri 与某些 Rails 控制器通信时,我收到错误消息:

require "net/https"

uri = URI.parse("https://server-name.domain.com/controller.json?date=2013-09-03") 
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.start {
  http.request_get(uri.path) {|res|
    print res.body
  }
}

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

我看过很多 StackOverflow 文章,它们建议简单地关闭 SSL 验证,使用:

http.verify_mode = OpenSSL::SSL::VERIFY_NONE

但我不认为这是一个令人满意的方法。我还看到一些文章建议我需要将open-uri 指向/etc/ssl/certs/ca-certificates.crt,这显然是针对公共证书的。所以对于我的自签名证书,我尝试了以下方法:

uri = URI.parse("https://server-name.domain.com/controller.json?date=2013-09-03") 
http = Net::HTTP.new(uri.host, uri.port)
if uri.scheme == "https"  # enable SSL/TLS
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  http.ca_file = "/etc/apache2/ssl/host-name.cer"
end
http.start {
  http.request_get(uri.path) {|res|
    print res.body
  }
}

哪个有效。

我的问题是,我如何告诉 OpenSSL / OpenURI 除了当前搜索路径之外,始终查看 /etc/apache2/ssl/ 目录?我不想在我提出的每个请求中指定路径(这将随着主机名的变化而变化,具体取决于我们的工作位置)。

谢谢

【问题讨论】:

    标签: ruby-on-rails-3 apache ssl openssl open-uri


    【解决方案1】:

    摘自here:

    如果磁盘上已有您要使用的 CA 包,请将 SSL_CERT_FILESSL_CERT_DIR 环境变量指向它,或在 Net::HTTP 中设置 ca_file=ca_path= 属性。

    所以你要做的就是这个

    ENV['SSL_CERT_FILE'] = "your certificate path"
    

    一切都应该工作。

    您可能会发现此资源很有用:

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2016-01-26
      • 2017-03-11
      • 2015-12-02
      相关资源
      最近更新 更多