Could you please give some advise?
Ecco una risposta più dettagliata e come risolvere il problema in Ruby con qualcosa di diverso il patetico OpenSSL::SSL::VERIFY_NONE
.
$ openssl s_client -connect 64.103.26.61:443 | openssl x509 -text -noout
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
...
Subject: C=US, ST=CA, L=San Jose, O=Cisco Systems, Inc., CN=msesandbox.cisco.com
...
X509v3 Subject Alternative Name:
DNS:msesandbox.cisco.com
Quindi l'appliance ha un nome DNS msesandbox.cisco.com. nslookup
ti dice la sua una buona hostname:
$ nslookup msesandbox.cisco.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
Name: msesandbox.cisco.com
Address: 64.103.26.61
Quindi la prima cosa che dovete fare è connettersi ad esso con il suo nome DNS, e non un indirizzo IP.
Se si emette i certificati per il dominio cisco.com
(o può fare una richiesta), allora si può chiedere che l'indirizzo IP 64.103.26.61 essere aggiunto come nome soggetto alternativo (SAN). Quindi ci saranno due SAN nel certificato.
Ora, se si va di nuovo al comando openssl
:
$ openssl s_client -connect 64.103.26.61:443 | openssl x509 -text -noout
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
verify error:num=19:self signed certificate in certificate chain
...
Issuer: C=US, O=HydrantID (Avalanche Cloud Corporation), CN=HydrantID SSL ICA G2
...
Subject: C=US, ST=CA, L=San Jose, O=Cisco Systems, Inc., CN=msesandbox.cisco.com
Si vedrà l'emittente e soggetto sono diversi. Ciò significa che questo è non un certificato autofirmato. Il certificato è stato emesso da HydrantID (Avalanche Cloud Corporation).
Se si guarda oltre, si vedrà la chiave pubblica del dell'Emittente (Authority Key Identifier) è diversa da quella chiave pubblica del Soggetto (Subject Key Identifier):
X509v3 Authority Key Identifier:
keyid:98:6A:B6:2D:2E:BF:A7:AA:9F:F6:F7:D6:09:AF:D5:8B:57:F9:8A:B7
...
X509v3 Subject Key Identifier:
B5:3D:50:53:0A:A2:06:9E:9A:29:89:7A:AB:96:90:FE:9D:6B:57:A0
Anche in questo caso, non è auto firmato.
Se si torna al comando OpenSSL ancora una volta, si vedrà l'emittente è HydrantID SSL ICA G2
, e la sua emittente è QuoVadis Root CA2 G3
:
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
verify return:1
depth=1 C = US, O = HydrantID (Avalanche Cloud Corporation), CN = HydrantID SSL ICA G2
verify return:1
depth=0 C = US, ST = CA, L = San Jose, O = "Cisco Systems, Inc.", CN = msesandbox.cisco.com
verify return:1
Ciò significa QuoVadis Root CA2 G3
emesso HydrantID SSL ICA G2
; e HydrantID SSL ICA G2
rilasciato msesandbox.cisco.com
. QuoVadis Root CA2 G3
è il top della catena alimentare.
È possibile recuperare QuoVadis Root CA2 G3
da QuoVadis CA Certificate Download:
$ curl -O -J -L https://www.quovadisglobal.bm/Repository/~/media/Files/Roots/quovadis_rca2g3_der.ashx
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1380 100 1380 0 0 1808 0 --:--:-- --:--:-- --:--:-- 5726
curl: Saved to filename 'quovadis_rca2g3_der.cer'
$ openssl x509 -in quovadis_rca2g3_der.cer -inform DER -out quovadis-ca.pem -outform PEM
$ cat quovadis-ca.pem
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
...
-----END CERTIFICATE-----
SE vi fidate QuoVadis per certificare l'apparecchio, quindi:
$ openssl s_client -connect msesandbox.cisco.com:443 -CAfile quovadis-ca.pem
CONNECTED(00000003)
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
verify return:1
depth=1 C = US, O = HydrantID (Avalanche Cloud Corporation), CN = HydrantID SSL ICA G2
verify return:1
depth=0 C = US, ST = CA, L = San Jose, O = "Cisco Systems, Inc.", CN = msesandbox.cisco.com
verify return:1
...
Start Time: 1420616960
Timeout : 300 (sec)
Verify return code: 0 (ok)
Avviso OpenSSL finito con Verify return code: 0 (ok)
. Questo ti dice che hai una buona catena. OpenSSL non esegue la corrispondenza del nome host, ma sappiamo già che il nome host nel certificato è buono.
Ora, per codice Ruby. Tutto quello che dovete fare è collegare il CA in Rubino:
#!/usr/bin/ruby
require 'net/http'
require 'net/https'
require 'openssl'
uri = URI('https://msesandbox.cisco.com:443')
options_mask = OpenSSL::SSL::OP_NO_SSLv2 | OpenSSL::SSL::OP_NO_SSLv3 | OpenSSL::SSL::OP_NO_COMPRESSION
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
if uri.scheme == "https"
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_file = File.join(File.dirname(__FILE__), "quovadis-ca.pem")
# http.ssl_options = options_mask
end
response = http.request request
Ed ecco una corsa:
$ ./Connect-Test.rb
$
Nessuna eccezione, e non OpenSSL::SSL::VERIFY_NONE
.
Si dovrebbe provare a utilizzare options_mask
poiché rimuove i protocolli deboli/feriti/rotti. Ma Ruby è così rotto e non documentato a volte, non sono mai riuscito a farlo funzionare.
sono stato in grado di radicare la fiducia sia in HydrantID SSL ICA G2
e QuoVadis Root CA2 G3
con OpenSSL (che significa ho ottenuto un Verify Result 0 (OK)
da OpenSSL). Ma Ruby poteva gestire solo (non era possibile creare una catena su HydrantID SSL ICA G2
). Più rotture rubino.
Grazie per la tua risposta dettagliata. Ora capisco il problema. Sembra che questo certificato autofirmato non sia adatto per il mio localhost.Ho installato un gioiello chiamato certificato che gestisce questo problema (non so come funziona) Ho rimosso OpenSSL :: SSL :: VERIFY_NONE dal mio codice. Come hai detto, per la produzione ho intenzione di scaricare il certificato dal download del certificato CA di QuoVadis –