2010-03-24 11 views
16

Wie kann ich die Zertifikate einer Website wie https://processing.ukash.com/ in Ruby mit net/http überprüfen?So validieren Sie die SSL-Zertifikatkette in Ruby mit net/http

https = Net::HTTP.new('processing.ukash.com', 443) 
https.use_ssl = true 
https.verify_mode = OpenSSL::SSL::VERIFY_NONE 

Funktioniert so weit, aber wie verifiziere ich, dass es jetzt das richtige cert ist? Ich habe das Zertifikat in Firefox gespeichert, aber die resultierende .pem-Datei enthält viele Zertifikate, und net/http scheint es nicht zu mögen.

Antwort

22

Aus meiner Code-Schnipsel Sammlung:

#!/usr/bin/env ruby 
# How to: 
# ======= 
# Use Ruby's net/https library, to verify a SSL certificate. 
# ========================================================== 
# - Without verification the following code will lead to: 
# warning: peer certificate won't be verified in this SSL session 
# 
# #------------------begin example----------------------------- 
# require 'net/http' 
# require 'net/https' 
# require 'uri' 
# 
# url = URI.parse 'https://myname:[email protected]/' 
# http = Net::HTTP.new(url.host, url.port) 
# http.use_ssl = (url.scheme == 'https') 
# request = Net::HTTP::Get.new(url.path) 
# request.basic_auth url.user, url.password 
# response = http.request(request) 
# #-------------------end example------------------------------ 
# 
# To verify the ssl cert cosider adapting the following. 
# Status: Untested 
# ======= 
# 
# References: 
# =========== 
# [1] http://mimori.org/%7Eh/tdiary/20080301.html#p03 
# [2] http://redcorundum.blogspot.com/2008/03/ssl-certificates-and-nethttps.html 
# 
require 'net/http' 
require 'net/https' 
require 'uri' 

RootCA = '/etc/ssl/certs' 

url = URI.parse 'https://myname:[email protected]/' 
http = Net::HTTP.new(url.host, url.port) 
http.use_ssl = (url.scheme == 'https') 
if (File.directory?(RootCA) && http.use_ssl?) 
    http.ca_path = RootCA 
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
    http.verify_depth = 5 
else 
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
end 
request = Net::HTTP::Get.new(url.path) 
request.basic_auth url.user, url.password 
response = http.request(request) 

hoffe, das hilft?

+0

Ich scheine Fehler aus dem Code zu erhalten. vielleicht PEBKAC. – Thufir

+1

Können Sie auf einen Fehler mit den Fehlern hinweisen? – Hedgehog

+0

Ich bat die Paste, für immer zu haften, aber weiß nicht. Anyway, Link: http://pastebin.mozilla.org/1460391 könnte leicht ich sein. Ich habe es noch nicht wirklich untersucht. – Thufir