如何使用内部签名的SSL证书部署Rails应用程序(SSL_CERT_FILE和openssl相关)

时间:2014-01-06 09:57:40

标签: ruby-on-rails ruby-on-rails-3 openssl ssl-certificate

关于使用SSL证书部署Rails应用程序,我有几个问题。

背景:

  • Rails 3.2.16 / Ruby 1.9.3
  • 内部Windows CA服务器签名的SAN SSL证书
  • 使用Apache / Passenger部署到Ubuntu 12.04服务器的应用程序

根据https://gist.github.com/fnichol/867550,使用Ruby net/http的Windows客户端不信任Ubuntu服务器上的证书。我假设这是因为未设置SSL_CERT_FILE环境变量(尽管内部根证书安装在Ubuntu服务器上并通过组策略部署到Windows客户端。?)

我希望能够从我的应用程序的任何客户端(Windows或Ubuntu)运行以下代码片段

require 'net/http'
uri = URI.parse('https://ubuntu-server.internal.com/')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.start { |agent| agent.get(uri.path) }
  1. 我应该将内部CA根证书(和中间证书以及CURL证书捆绑的其余部分)与应用捆绑在一起,然后在代码中设置ENV['SSL_CERT_FILE']吗?

  2. 我应该只在应用程序中包含内部CA根证书,并使用初始化程序在使用前设置net / http吗?这似乎是RubyInstaller https://github.com/oneclick/rubyinstaller/blob/master/rake/contrib/uri_ext.rb#L287-295的方法,但我真的不知道我将如何编码呢?​​

  3. 还有别的吗?

  4. 选项2对我来说似乎是最好的,但正如我所说,我不知道如何设置

    http.use_ssl = true
    http.ca_file = "#{Rails.root}/config/internal-ca.crt"
    

    在Rails初始化程序中。

    非常感谢任何帮助/建议。

    由于

1 个答案:

答案 0 :(得分:5)

所以,通过一些Googling,我提出了以下解决方案:

# /config/initializers/ssl.rb

require 'open-uri'
require 'net/https'

module Net
  class HTTP
    alias_method :original_use_ssl=, :use_ssl=

    def use_ssl=(flag)
      store = OpenSSL::X509::Store.new
      store.set_default_paths

      store.add_cert(OpenSSL::X509::Certificate.new(File.read("#{Rails.root}/config/ssl/root.crt")))
      store.add_cert(OpenSSL::X509::Certificate.new(File.read("#{Rails.root}/config/ssl/intermediate.crt")))

      self.cert_store = store

      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end

来源

这似乎对我有用,但我对其他建议持开放态度。