【发布时间】: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