2016-03-23 7 views
2

In Ruby, ich versuche, eine SSL-Verbindung zu einem Nginx-Server ich lokal einrichten, mit einem Auto-signierten Zertifikat. Mein Code ist:Ruby https mit ca-Zertifizierung funktioniert nicht, während es mit curl arbeitete

require "net/http" 
require "net/https" 
require "openssl" 
require "uri" 
require "pp" 

request = Net::HTTP::Get.new("/") 
response = Net::HTTP.start(
    "localhost", 
    443, 
    { 
    :use_ssl => true, 
    :key => OpenSSL::PKey::RSA.new(File.read("/home/gg/crt/client.key")), 
    :cert => OpenSSL::X509::Certificate.new(File.read("/home/gg/crt/client.crt")), 
    :ca_file => "/home/gg/crt/ca.pem", 
    :verify_mode => OpenSSL::SSL::VERIFY_PEER, 
    :verify_depth => 5, 
    } 
) do |http| 
     http.request(request) 
end 
puts response.inspect 
puts response.body 

Als ich es es

Rückkehr laufen
/home/gg/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect returned=1 errno=0 state=error: certificate verify failed (OpenSSL::SSL::SSLError) 
    from /home/gg/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:923:in `block in connect' 
    from /home/gg/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/timeout.rb:74:in `timeout' 
    from /home/gg/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:923:in `connect' 
    from /home/gg/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:863:in `do_start' 
    from /home/gg/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:852:in `start' 
    from /home/gg/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:583:in `start' 
    from testso.rb:8:in `<main>' 

Aber ich habe das richtige Ergebnis, wenn ich es mit curl laufen:

curl https://localhost --key crt/client.key --cert crt/client.crt --cacert crt/ca.pem 

Was mache ich falsch?

Antwort

0

Ich fühle mich dumm, aber herausgefunden, das Problem.

Beim Generieren der verschiedenen Zertifikate habe ich einige Felder leer gelassen. Es scheint, dass openssl dieses Zertifikat als "schauend" erkannt hat.

Wenn wir also OpenSSL verwenden :: SSL :: verify_peer die Verbindung

nicht so sicher sein, dass das Zertifikat auch die CA generiert wird verwenden, können Sie tun: openssl verify -CAfile ca.crt server.crt (und denselben Befehl mit client.crt

)

wenn wir bekommen

error 18 at 0 depth lookup:self signed certificate 
OK 

Das Zertifikat erkannt wird als autosigned und es versagt

wenn wir

Signature ok 

Es bekommen sollte möglicherweise

0

arbeiten, um anderen zu helfen, ist hier eine funktionierende Lösung mit Ruby-2.0 für einen HTTP-GET.

require "net/http" 

uri = URI.parse('https://your_url.com') 
http = Net::HTTP.new(uri.host, uri.port) 
OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ssl_version]=nil 
http.use_ssl = true 
http.ca_path='/etc/pki/tls/certs/' 
http.ca_file='/etc/pki/tls/certs/YOUR_CERT_CHAIN_FILE' 
http.cert = OpenSSL::X509::Certificate.new(File.read("YOUR_CERT)_FILE")) 
http.key = OpenSSL::PKey::RSA.new(File.read("YOUR_KEY_FILE")) 

#SSLv3 is cracked, and often not allowed 
http.ssl_version = :TLSv1_2 

#### This is IMPORTANT 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 

#Crete the GET request 
request = Net::HTTP::Get.new(uri.request_uri) 
#Add Headers, if needed 
request.add_field 'X_REMOTE_USER', 'USER_NAME' 
request.add_field 'Accept', '*' 

#Get Response 
response = http.request(request) 

#Review Response 
puts response.body 
+1

In der Tat hat es funktioniert. Aber der Punkt war, SSL :: VERIFY_NONE nicht zu setzen. Dadurch verringern Sie die Sicherheit. – GPif

Verwandte Themen