OpenSSL falla aleatoriamente al verificar la cadena de certificados de una URL en el puerto 443 y puede verificar todos los puertos de instancia

OpenSSL falla aleatoriamente al verificar la cadena de certificados de una URL en el puerto 443 y puede verificar todos los puertos de instancia

Espero que alguien pueda ayudarme porque estoy perdido. Mi equipo ha estado sufriendo problemas por la falta de certificados intermedios en nuestros servicios. Me encargaron escribir un script que probara continuamente todas las URL de nuestros servicios de alto tráfico, una por una, para verificar que la cadena de certificados estuviera completa. Escribí un programa C# que ejecutaba OpenSSL y analizaba el resultado. Aquí está el comando OpenSSL que ejecuté en cada URL:

"openssl.exe s_client -showcerts -servername " + uri + " -verify_hostname " + uri + " -connect " + uri +":" + port

O

openssl.exe s_client -showcerts -servername www.euro-example-01.com -verify_hostname www.euro-example-01.com -connect www.euro-example-01.com:443

El puerto es 443 por defecto y se utiliza el 99% del tiempo. Si OpenSSL alguna vez regresara “Verify return code: 21 (unable to verify the first certificate)”, sabría que falta un certificado intermedio y se activaría una alerta. Además, OpenSSL genera la cadena para que pueda verificar esto. Esto funcionó al realizar pruebas en sitios como incomplete-chain.badssl.com.

Ahora se ejecuta continuamente en la nube y ocasionalmente generará alertas. Sin embargo, muchas veces nuestro ingeniero de servicio comprobará cada servidor de la URL defectuosa utilizando el puerto de instancia y encontraremos0 casos en los que está fallando. Usamos equilibrio de carga por turnos, entonces, ¿no deberíamos esperar que al menos uno de estos servidores individuales sea el que cause que el 443 falle? Los registros de OpenSSL del caso de error :443 muestran solo un certificado en la cadena y sitios como SSLLabs también confirmaron que falta un certificado.

Si nuestro ingeniero reiniciara los puntos finales infractores, se encontraría la cadena completa y las alertas de intermedios faltantes desaparecerían.

Quizás la parte más extraña es que configuré un script separado para probar solo 4 URL en lugar de las ~160 URL diferentes. Ayer, en un lapso de 30 minutos, euro-example-01.com:443se probó 12 veces y falló 6 de esas veces en el guión original. En esos mismos 30 minutos, el nuevo script de prueba más pequeño euro-example-01.com:443se probó 12 veces y se aprobó las 12 veces. Podría ser que los dos scripts lleguen a servidores diferentes, pero me parece sospechoso.

Como dije, no sabemos por qué sucede esto. Le pedí a nuestro ingeniero de servicio que revisara el balanceador de carga y dijo que está funcionando bien. No hemos localizado ningún patrón de lo que provoca que las pruebas comiencen a fallar. ¿Alguno de ustedes tiene una idea de por qué sucede esto? Alternativamente, ¿hay alguna manera de saber qué puerto de instancia se ve afectado cuando probamos con :443? Es posible que necesitemos cambiar a pruebas en puertos de instancia en lugar de :443, pero nuestro recuento de instancias cambia regularmente y hay una gran cantidad de ellas.

¡Gracias de antemano por cualquier ayuda que puedas brindar!

tl; dr: El puerto 443 en nuestra URL no devolverá un certificado intermedio, pero cuando verificamos los servidores individuales para dicha URL, siempre se encuentra un certificado intermedio.

información relacionada