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