¿Es posible dentro de los límites de la especificación X.509 marcar una CA intermedia como confiable para un propósito específico, por ejemplo? para verificar una clave de servidor VPN, HTTPS, etc., como si funcionara con una CA raíz.
Todos mis clientes VPN tienen una forma de proporcionar explícitamente un certificado de CA de confianza, que se usa para verificar la autenticidad del servidor VPN. Siempre que proporcione el certificado de CA raíz, esto funciona como se esperaba: el certificado es de confianza. (Los certificados intermedios se proporcionan como parte del protocolo de enlace TLS).
Sin embargo, estoy usando una CA intermedia y me gustaría mucho proporcionar ese certificado, en lugar de la CA raíz. En mi entendimiento de X.509, eso debería funcionar:
La clave del servidor VPN está firmada por la CA intermedia y, según tengo entendido, X.509, eso es todo lo que se necesita para establecer una cadena confiable.
Pero en la práctica, no funciona: mi cliente VPN no se conecta.
Además de VPN, lo he intentado con la autenticación 802.1X / EAPOL y varios clientes, con los mismos resultados: proporcionar el certificado CA de la raíz al trabajo del cliente; proporcionar mi certificado CA intermedio no lo hace.
¿Es eso por diseño o es cómo funcionan la mayoría de las implementaciones?
(uso un VPN basado en TLS, pero como también lo he probado con 802.1X y TTLS, parece estar relacionado con TLS o X.509, y no con mi arquitectura de cliente / servidor VPN específica). / p>
Actualización: He recibido un compromiso de OpenSSL que implique agregar el no-yo -signados los certificados de CA como anclajes de confianza. Desafortunadamente, esto aún no está incluido en ninguna versión de lanzamiento, por lo que todas las soluciones propuestas en los comentarios siguen vigentes.
Actualización 2:
OpenSSL ahora contiene esta opción en la versión de lanzamiento, a partir de la 1.0.2. El indicador correspondiente para el cliente de la línea de comando es partial_chain
, y el indicador programático parece ser X509_V_FLAG_PARTIAL_CHAIN
.
Además, recientemente tuve que verificar los certificados de servidor en Java: al menos en la versión JDK 1.8 de la implementación SSL del proveedor Sun JSSE, agregar un certificado de hoja al TrustManager
predeterminado funciona sin ninguna configuración especial y la verificación se realiza correctamente si la CA raíz ha sido proporcionada.