如何使用特定签名证书从HTTPS连接验证SSL证书?

时间:2014-09-08 06:04:46

标签: ruby ssl https x509

我正在更改一些Ruby代码以使用https方案,但我并不满意将SSL验证策略设置为VERFIY_NONE。 如何从远程服务器验证SSL证书是否正版?

1 个答案:

答案 0 :(得分:0)

假设您要从HTTPS服务器检索资源。

许多人选择将HTTP verify_mode设置为OPENSSL :: SSL :: VERIFY_NONE以绕过任何 SSL证书验证,但让Ruby验证SSL证书非常简单。

请注意,有些人使用OpenSSL :: X509 :: Store#set_default_paths来使用系统的默认受信任证书。 如果这适合你,那很酷,但在我的情况下,可信签名证书不在系统商店中。我需要一个 使用内部生成的公共签名证书验证内部站点SSL证书的方法。

您绝对需要的一件事是签署网站SSL证书的实体的公共证书。在我的 case,我有cert文件,但我需要将它从DER X.509证书(.cer文件)转换为Base-64编码 X.509证书,然后将CER扩展名重命名为PEM。大多数平台(Windows,Linux,OSX等)都具有用于导入和导出证书的证书管理工具。这是必需的,因为Ruby似乎存在本机消耗DER证书的问题。

有了PEM文件后,我编写了以下代码

url = URI.parse(https_url)
http = Net::HTTP.new(url.host, url.port)
if url.scheme == 'https'
  http.use_ssl = true
  # most people use VERIFY_NONE - change to force cert check
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER

  #load the cert file
  cert  = Pathname.new(Dir.pwd) + "cert.pem"
  fail "no certificate file found" unless cert.exist?
  store = OpenSSL::X509::Store.new
  store.add_cert(OpenSSL::X509::Certificate.new(File.read(cert)))
  http.cert_store = store
end

# get the resource, validating the remote SSL cert first
response = http.request(Net::HTTP::Get.new(url.request_uri))