Estallé en internet durante bastante tiempo, pero no pude encontrar nada que respondiera a mi problema. Por lo tanto, si se responde un problema similar antes, comparte el enlace.
Problema :
Tengo una configuración de intranet en la que necesito tener autenticación de cliente mediante SSL.
Seguí esta guía para crear CA y certificados
Suponga que la máquina A está intentando conectarse a la máquina B (también se requiere lo contrario). La máquina A tiene una CA intermedia (I-CA-a) emitida por la CA raíz. La máquina B tiene otra CA intermedia (I-CA-b) emitida por la misma CA raíz. Tanto A como B tienen el certificado público de CA raíz. La máquina A no sabe acerca de I-CA-b y la máquina B no sabe acerca de I-CA-a.
La máquina B ejecuta el servidor con un certificado de servidor firmado por I-CA-b, y la máquina A está intentando conectarse al servidor B mediante un certificado de cliente firmado por I-CA-a.
¿Es posible que la máquina B acepte la conexión desde la máquina A desde
- la máquina B no tiene información sobre I-CA-a
- pero I-CA-a fue emitido por la CA raíz en la que la máquina B confía.
He intentado configurar httpd en la máquina B de esta manera.
SSLVerifyClient require
SSLVerifyDepth 10
SSLCACertificateFile "/root/ca/certs/root_ca.cert.pem"
Cuando intento conectarme a B desde A usando curl
curl --cacert /root/ca/certs/root_ca.cert.pem --cert /root/ca/intermediate/certs/client-A.cert.pem --key /root/ca/intermediate/certs/client-A.key.pem https://<ip of machine B>/...
Esto falla con la siguiente salida.
curl: (35) Peer does not recognize and trust the CA that issued your certificate.
Intenté encadenar el certificado de CA del emisor del certificado de cliente (certificado de I-CA-a) con client-A.cert.pem
cat /root/ca/intermediate/certs/intermediate.cert.pem /root/ca/intermediate/certs/client-A.cert.pem > /root/ca/intermediate/certs/client-A-chained.cert.pem
y utilicé esto con rizo
curl --cacert /root/ca/certs/root_ca.cert.pem --cert /root/ca/intermediate/certs/client-A-chained.cert.pem --key /root/ca/intermediate/certs/client-A.key.pem https://<ip of machine B>/...
Esto también falla con la siguiente salida.
curl: (35) Peer reports failure of signature verification or key exchange.
Si hago el encadenamiento de otra manera, es decir,
cat /root/ca/intermediate/certs/client-A.cert.pem /root/ca/intermediate/certs/intermediate.cert.pem > /root/ca/intermediate/certs/client-A-chained.cert.pem
entonces el mismo comando curl falla con esta salida.
curl: (35) Peer does not recognize and trust the CA that issued your certificate.
¿Qué estoy haciendo mal? ¿Es incluso posible autenticar clientes de esa manera? De lo contrario, ¿puede alguien sugerir una forma alternativa de autenticar a los clientes mediante SSL?
La restricción es que, aparte de una CA raíz y la firma de CA intermedias, el resto del certificado y la generación de claves deben estar automatizadas.
Por lo tanto, es posible que la máquina B deba proporcionar certificados de cliente a varios clientes en tiempo de ejecución.
Alternativa en la que puedo pensar pero con un problema :
La máquina A genera una clave privada y una CSR y envía esa CSR a la máquina B. La máquina B firma el CSR utilizando I-CA-b y lo envía de vuelta a la máquina A, que la máquina A puede usar. Pero el problema es que ¿cómo autentificará la máquina A la máquina B antes de firmar el CSR?
Actualizar Encontré esto después de que publiqué la pregunta. Esto parece responder parte de mi pregunta. Pero todavía necesito más calrificación.
Actualización 2 También encontré esto , aunque no hay mucho para ayudar. Si es un problema CURL, ¿hay alguna otra alternativa?