Как развернуть приложение Rails с сертификатом SSL с внутренней подписью (связанным с SSL_CERT_FILE и openssl)

У меня есть несколько вопросов относительно развертывания приложения Rails с сертификатом SSL.

Фон:

  • Рельсы 3.2.16 / Руби 1.9.3
  • SSL-сертификат SAN, подписанный внутренним сервером ЦС Windows
  • Приложение развернуто на серверах Ubuntu 12.04 с помощью Apache/Passenger.

Согласно https://gist.github.com/fnichol/867550, клиенты Windows, использующие Ruby net/http не доверяйте сертификату на серверах 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. Что-то другое?

Вариант 2 кажется мне лучшим на данный момент, но, как я уже сказал, я не знаю, как я буду настраивать

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

в инициализаторе Rails.

Любая помощь/совет будет принята с благодарностью.

Спасибо


person rwb    schedule 06.01.2014    source источник


Ответы (1)


Итак, немного погуглив, я нашел следующее решение:

# /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

Источники

Кажется, это работает для меня, но я открыт для других предложений.

person rwb    schedule 06.01.2014