falla de reconocimiento ssl no se pudo obtener el certificado del emisor local

0

Tengo un problema con la nueva integración en la que estoy trabajando. Debería consumir un servicio web provisto por una empresa externa y este servicio se realiza a través de https, por lo que para poder integrarlos, han compartido tres certificados:

  1. Root.cer
  2. Sahred.cer y el emisor es Root.cer
  3. user.cer y el emisor es Shared.cer

Los instalé todos y ejecuto los siguientes comandos sin bloqueo.

openssl connect comando al servicio web con opción de showcerts

openssl s_client -showcerts -connect https://example.com:8443

salida:

CONNECTED(00000003)
depth=1 C = UK, O = EXA, OU = EXA eTrust Center, CN = EXA Shared CA
verify error:num=20:unable to get local issuer certificate
140539532310416:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1493:SSL alert number 40
140539532310416:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
---
Certificate chain
 0 s:/C=SA/O=EXA/OU=EXA eTrust Center/CN=example.com
   i:/C=SA/O=EXA/OU=EXA eTrust Center/CN=EXA Shared CA
-----BEGIN CERTIFICATE-----
-----------
-----END CERTIFICATE-----
 1 s:/C=SA/O=EXA/OU=EXA eTrust Center/CN=EXA Shared CA
   i:/C=SA/O=EXA/OU=EXA eTrust Center/CN=EXA Root CA
-----BEGIN CERTIFICATE-----
------
-----END CERTIFICATE-----
---
Server certificate
subject=/C=SA/O=EXA/OU=EXA eTrust Center/CN=example.com
issuer=/C=SA/O=EXA/OU=EXA eTrust Center/CN=EXA Shared CA
---
No client certificate CA names sent

comando curl con depuración de protocolo de enlace:

curl -X POST https://example.com:8443 -iv

salida:

 * TLSv1.2 (OUT), TLS header, Certificate Status (22):
} [5 bytes data]
 * TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
 * TLSv1.2 (IN), TLS handshake, Server hello (2):
{ [87 bytes data]
 * TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [3593 bytes data]
 * TLSv1.2 (OUT), TLS alert, Server hello (2):
} [2 bytes data]
 * SSL certificate problem: unable to get local issuer certificate
 * stopped the pause stream!

comando de curvatura con depuración de handshake y verificación de omisión:

curl -X POST https://example.com:8443 -iv -k

salida:

 * TLSv1.2 (OUT), TLS header, Certificate Status (22):
} [5 bytes data]
 * TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
 * TLSv1.2 (IN), TLS handshake, Server hello (2):
{ [87 bytes data]
 * TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [3593 bytes data]
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [333 bytes data]
 * TLSv1.2 (IN), TLS handshake, Request CERT (13):
{ [36 bytes data]
 * TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
 * TLSv1.2 (OUT), TLS handshake, Certificate (11):
} [7 bytes data]
 * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [70 bytes data]
 * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
} [1 bytes data]
 * TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
 * TLSv1.2 (IN), TLS alert, Server hello (2):
{ [2 bytes data]
 * error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

Mis preguntas:

  • ¿Cuáles son los beneficios de crear tres certificados con el emisor? de esa manera?
  • ¿Por qué ha fallado el protocolo ssl? ¿Me perdí algo en mis comandos?
  • ¿Tiene alguna idea de cómo puedo manejar estos certificados o al menos cómo funciona esta comunicación?
  • Realmente no entiendo cómo funciona esta comunicación. ¿Cómo puedo enviar estos certificados sin ninguna clave privada? Basado en mi entendiendo cuando queremos crear autenticación basada en SSL I Debería crear una clave pública y una clave privada y debería compartir esto Clave pública con la empresa externa, para que puedan descifrar el mensaje. cuando cifrado por mi clave privada. es esto correcto?

También he publicado una pregunta con java en stackoverflow sin bloqueo, puedes echar un vistazo para obtener más información. enlace

    
pregunta mzaje18 24.11.2018 - 21:51
fuente

1 respuesta

0

Algunas lecturas básicas sobre TLS / SSL

"SSL" es el nombre antiguo, lo llamaré "TLS" en esta publicación.

Debes leer un poco para obtener una comprensión básica de cómo funciona TLS. Google "¿Cómo funciona el protocolo de enlace TLS?" Debería conseguirte algunos buenos artículos. También tenemos una publicación general (pensamos que puede ser más larga y más detallada de lo que usted desea): ¿Cómo funciona SSL / TLS?

Aquí hay un artículo específico para curl sobre cómo funciona TLS: enlace

¿Por qué una cadena de CA?

Es normal que los certificados HTTPS tengan esa estructura con una CA raíz, una CA emisora y el certificado del sitio web; por ejemplo, consulte el certificado de esta página:

Pararesponderasucuartapregunta:elobjetivodeestoscertificadosesqueelservidorpuedademostrarlequeesquiendicequees,porloqueelsitiowebmantienelaclaveprivadayusted(elcliente)puedeusarsupúblicoclave(tambiénconocidocomo"certificado") para verificar que sea el servidor auténtico. En ninguna parte, el cliente está demostrando su identidad con el servidor (esto generalmente se logra al incluir una clave API en la solicitud).

Solucionando tu error

Recuerde que TLS se trata de establecer confianza; la validación del certificado de un servidor implica estos pasos:

  • ¿Es válido el certificado de usuario final? ¿Quién lo emitió y confío en ellos?
  • ¿Es válido el certificado de CA intermedio? ¿Quién lo emitió y confío en ellos?
  • ¿Es válido el certificado de CA raíz? ¿Confío en ello?

Entonces, al validar, usted "encadena" a la raíz y luego verifica su "almacén de confianza" (un archivo en su computadora de certificados de CA raíz que son "de confianza") para ver si el certificado raíz está allí. Todos los sistemas operativos, navegadores, etc. se enviarán con una lista de certificados de CA raíz en los que confía. en el caso de curl, es un archivo en el disco llamado curl-ca-bundle.crt .

Mi conjetura es que la CA raíz con la que estás tratando no está en la lista predeterminada de curl, por lo que necesitas agregarla manualmente. En el artículo sobre rizos al que he vinculado anteriormente, explican cómo hacerlo en el Paso 4.

¡Buena suerte y bienvenido al mundo de TLS y certificados!

    
respondido por el Mike Ounsworth 24.11.2018 - 22:10
fuente

Lea otras preguntas en las etiquetas