2010-12-01 22 views
13

Me está costando mucho conseguir SSL para verificar un certificado. Soy completamente ignorante sobre cómo funcionan los certificados, por lo que es una gran desventaja para empezar. Aquí está el error que consigo cuando se ejecuta la secuencia de comandos:connect: SSL_connect returned = 1 errno = 0 state = SSLv3 read server certificate B: certificate verify failed (OpenSSL :: SSL :: SSLError)

c:/Ruby191/lib/ruby/1.9.1/net/http.rb:611:in `connect': SSL_connect returned=1 e 
rrno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL 
::SSL::SSLError) 

Aquí está el código correspondiente:

client = Savon::Client.new order_svc 

request = client.create_empty_cart { |soap, http| 
    http.auth.ssl.cert_file = 'mycert.crt' 
    http.auth.ssl.verify_mode = :none 
    http.read_timeout = 90 
    http.open_timeout = 90 
    http.headers = { "Content-Length" => "0", "Connection" => "Keep-Alive" } 
    soap.namespaces["xmlns:open"] = "http://schemas.datacontract.org/2004/07/Namespace" 
    soap.body = { 
     "wsdl:brand" => brand, 
     "wsdl:parnter" => [ 
     {"open:catalogName" => catalogName, "open:partnerId" => partnerId } 
     ] }.to_soap_xml 

     } 

Cualquier ayuda se agradece.

+0

He actualizado a la última Savon 0.8.0.beta4 beta y HTTPClient a 2.1.5 . El mensaje de error cambió un poco, pero sigue recibiendo el mismo error. D, [2010-12-01T09: 53: 58.500216 # 3116] DEPURACIÓN -: Recuperar WSDL de: https: //testsite/MyService.svc? Wsdl en la profundidad 0 - 20: no se puede obtener el certificado de emisor local c: /Ruby191/lib/ruby/gems/1.9.1/gems/httpclient-2.1.5.2/lib/httpclient/session.rb : 247: en 'connect ': SSL_connect returned = 1 errno = 0 state = SSLv3 read certif de servidor ica B: verificación de certificado fallida (OpenSSL :: SSL :: SSLError) – r3nrut

+0

Mire mi respuesta aquí: http://stackoverflow.com/a/16983443/11792 –

+1

*** Mala idea ***: * 'http.auth.ssl.verify_mode =: none' *. Si no era necesario proteger los activos, el servidor no usaría HTTPS ni SSL/TLS. – jww

Respuesta

-1

Nota: yo estaba trabajando con la automatización de pruebas en entornos de nivel inferior que no lo hicieron ha firmado correctamente los certificados y a menudo lanzará errores debido a las firmas de dominio no coincidentes. Para el problema en a mano, eludir las firmas era una solución plausible, pero no es una solución que se utilizará para el desarrollo del nivel de producción.

Mi problema es que estoy intentando validar un certificado autofirmado. Todo lo que tuve que hacer fue poner el siguiente código y omitir todo lo relacionado con la validación de certificados.

Tuve que hacer esto para mis llamadas SOAP y REST que experimentaban el mismo problema.

de SOAP utilizando Savon

client = Savon::Client.new order_svc 

request = client.create_empty_cart { |soap, http| 
    http.auth.ssl.verify_mode = :none 
    http.headers = { "Content-Length" => "0", "Connection" => "Keep-Alive" } 
    soap.namespaces["xmlns:open"] = "http://schemas.datacontract.org/2004/07/Namespace" 
    soap.body = { 
     "wsdl:brand" => brand, 
     "wsdl:parnter" => [ 
     {"open:catalogName" => catalogName, "open:partnerId" => partnerId } 
     ] }.to_soap_xml 

     } 

REST utilizando HTTPClient

client = HTTPClient.new 
client.ssl_config.verify_mode=(OpenSSL::SSL::VERIFY_NONE) 
resp = client.get(Methods) 
+5

¡No hagas esto! No omita la verificación de certificados especialmente en producción. Echa un vistazo a mi respuesta aquí http://stackoverflow.com/a/16983443/11792 –

+1

No hagas esto. –

+0

Para ser claros, estaba usando esto para un marco de automatización de pruebas donde el entorno objetivo era cualquier cosa, desde la preproducción y desde abajo y el uso de certs con firma automática. No practicaría la omisión de la verificación de certificados en producción. Gracias por la advertencia sin embargo. – r3nrut

1

Debe proporcionar el archivo de clave privada que acompaña a su certificado.

http.auth.ssl.cert_key_file = "mycert.pem" 

Si se encripta el archivo de clave privada, tendrá que proporcionar la contraseña también:

http.auth.ssl.cert_key_password = "foobar" 
1

Poner el http.auth.ssl.verify_mode = :none dentro del bloque client.request no funciona para mí.

tuve que usar:

client = Savon::Client.new do |wsdl, http| 
    http.auth.ssl.verify_mode = :none 
    wsdl.document = #YOUR_WSDL_URL_HERE 
end 

Usando Savon 0.9.9 y Ruby 1.9.3-p125

+0

Esto funcionó para mí con Ruby 1.9.2-p320 y savon 1.2.0. Solo comencé a experimentar este problema cuando actualicé savon de <1.0 a 1.2.0. –

+0

Use ssl_verify_mode:: none - por ejemplo ... client = Savon.client (wsdl: 'https: // your_url? Wsdl', ssl_verify_mode:: none) – genegc

+1

Permítame repetir BJ Clarke y otros: no lo haga hacer esto. Si no era necesario proteger los activos, los servidores no usarían HTTPS ni SSL/TLS. – jww

5

comprobar su cert.pem y su key.pem

la clave del CERT deben tener uno

-----BEGIN CERTIFICATE----- 
MIIFGDCCBACgAwIBAgIKG1DIagAAAAAAAzANBgkqhkiG9w0BAQsFADCBvDEkMCIG 
.... 
-----END CERTIFICATE----- 

su key.pem debe tener

-----BEGIN PRIVATE KEY----- 
CSqGSIb3DQEJARYVY2Fjb250YWN0QGVzY3JlZW4uY29tMQswCQYDVQQGEwJVUzEP 
.... 
-----END PRIVATE KEY----- 

y puede tener algunos certs, pero eso no importa en este caso. (Aunque funciona para mí ya que curl no funciona sin los certificados adicionales) El servicio web con el que hablo tiene una buena CA raíz, pero las claves de autenticación del cliente no son confiables, por lo que esta es la razón por la que los certificados adicionales hacen que Curl funcione.

obtener los de su certificado de cliente fue lo que me causó los problemas.

esto es lo que funcionó para mí.

openssl pkcs12 -in Client.pfx -clcerts -nokeys -out cert.pem 
openssl pkcs12 -in Client.pfx -nodes -out key.pem 

cada uno se le pedirá la contraseña de importación y se puede establecer una contraseña pem si lo desea. (Que tendría que establecer que en el código de rubí más adelante)

require 'savon' 
client = Savon::Client.new "https://service/Service.asmx?wsdl" 
client.http.auth.ssl.cert_key_file = "key.pem" 
client.http.auth.ssl.cert_file = "cert.pem" 
client.http.auth.ssl.verify_mode=:peer 

p client.wsdl.soap_actions 

también puede probar con el enrollamiento

curl -v -E key.pem https://services/Service.asmx?wsdl 
+0

Esta solución funcionaría bien, pero en ese momento estaba buscando una respuesta para abordar un certificado autofirmado en el que solo tenía que ignorarlo. ¡Gracias! – r3nrut

+1

*** Plus One ***: no le indicó al OP que desactive la verificación del certificado. – jww

Cuestiones relacionadas