En primer lugar, tenga en cuenta que soy nuevo en la configuración de SSL. En el pasado, siempre tuve la suerte de contar con un departamento de TI que me lo preparó con anticipación. Así que prepárate para la posibilidad de que necesite pedir una aclaración sobre algunas de tus respuestas. =)Apache no solicitará mi certificado de cliente SSL
Lo que estoy tratando de hacer
Soy la creación de una página web en intranet de la compañía para los empleados. Por ejemplo, habrá una página de inicio del navegador que muestra contenido personalizado para cada empleado. Como tal, debo ser capaz de identificar a dicho empleado sin necesidad de ningún nombre de usuario/contraseña u otra sugerencia (la configuración de una sola vez está bien, simplemente no quiero que se me solicite cada vez). Naturalmente, SSL parece ser la mejor manera de hacerlo.
Voy a tener una configuración de base de datos MySQL para asociar cuentas de "usuario" con SSL_CLIENT_M_SERIAL y SSL_CLIENT_I_DN, que asumo será único para cada certificado de cliente (?). Obtuve esa idea de este artículo: http://cweiske.de/tagebuch/ssl-client-certificates.htm
La primera vez que el usuario va al sitio web interno, no tendrá un certificado (¡NO quiero generarlos manualmente para los clientes!), En cuyo caso $ _SERVER ["SSL_CLIENT_VERIFY"] == "NINGUNO". Si eso sucede, irá a la página de configuración de la cuenta del usuario, que incluirá un paso donde PHP genera un certificado de cliente SSL y lo envía al navegador para que el usuario lo instale. Agradable y simple. Luego, el usuario instala el certificado, se establece la asociación y luego de reiniciar el navegador (como medida), el usuario regresa al sitio web interno.
En este punto, Apache debe solicitar el certificado del cliente, que luego el navegador envía. El script PHP analiza las variables $ _SERVER necesarias, se compara con la base de datos MySQL, y todos disfrutan de buenos momentos. De nuevo, agradable y simple.
lo que está funcionando hasta ahora
que tienen los certificados de servidor instalados. Y sí, son autofirmados (por razones obvias). Apache tiene instalado mod_ssl y todo eso parece estar funcionando bien. Creé un script PHP que simplemente volca el array $ _SERVER, y todos los valores de la clave SSL_SERVER_ * coinciden con el certificado que creé para él.
El problema
no puedo obtener los certificados de cliente para trabajar! En ese mismo script PHP, no importa lo que haga, SSL_CLIENT_VERIFY == "NONE" y las otras claves SSL_CLIENT_ * faltan. Esto es lo que sucede si SSLVerifyClient se establece como opcional en ssl.conf. De acuerdo con cada tutorial que he leído, todos dicen que el servidor web debería pedirle al navegador un certificado de cliente. La cosa es que no puedo hacer que haga eso. Simplemente va directo al script PHP y asume que no tengo ningún certificado de cliente. Esto sucede en Firefox, Chrome e IE.
Intenté configurar SSLVerifyClient como requerido y reinicié el servidor web. Con esa opción en su lugar, ni siquiera puedo establecer una conexión SSL. Firefox solo dice que la conexión se ha restablecido (otros navegadores también muestran sus propias versiones de ese error). ¡Lo extraño es que los registros no muestran CUALQUIER actividad en estos intentos de conexión! Es decir. access_log, error_log, ssl_access_log, ssl_error_log, Y ssl_request_log no muestran NADA; es como si el intento nunca hubiera ocurrido. Esto es frustrante porque significa que ni siquiera tengo un mensaje de error para trabajar. Solo un servidor web pasivo-agresivo diciéndome que vaya al infierno.
Intenté generar/instalar mi propio certificado de cliente manualmente utilizando la extensión OpenSSL de PHP. El certificado se instaló muy bien, aunque no puedo encontrar ninguna información sobre cómo asociar ese certificado con el del servidor (suponiendo que incluso tenga que hacerlo). Además, no parece importar de todos modos, ya que Apache aún no solicitará un certificado de cliente si se configura opcional. Y si se establece require, simplemente explota sin explicación. Necesito que se configure de manera opcional para que este esquema funcione.
El Medio Ambiente
OS: CentOS 5.7 de 64 bits (VirtualBox)
Apache: 2.2.3
PHP: 5.3.10
Te estoy adivinando podría Necesito más información para ayudarme, así que por favor pregunte. Te proporcionaré lo que necesites.
Para resumir, necesito saber cómo lograr que Apache solicite un certificado de cliente SSL dadas las condiciones descritas anteriormente. Además, si hay alguna firma/etc especial que deba hacerse para que el certificado del cliente sea "compatible" con el certificado del servidor (¡nuevamente, SIN hacerlo manualmente a través del intérprete de comandos para cada certificado de cliente!), Tendré que saberlo como bien.
Estoy 100% atrapado en esto a partir de ahora. No se puede encontrar nada remotamente útil en Google. ¡Cualquier ayuda que pueda brindarle será TESTIMONIALMENTE apreciada! ¡Gracias! =)
¿Cada certificado de cliente generado es autofirmado? ¿O creaste tu propia CA para firmar las solicitudes generadas? El cliente solo le solicitará un certificado si tiene uno instalado que está firmado por una autoridad de confianza (que está determinado por el almacén de confianza del servidor). Si cada certificado de cliente es autofirmado, necesitaría que cada uno de esos certificados generados esté en el almacén de confianza del servidor, lo que no sería factible. – bobz32
Intenté crear un certificado de cliente en el servidor usando openssl, exportando como p12, luego instalándolo en Firefox, pero ahora obtengo un error "no se puede obtener el certificado de emisor local" de Apache. Firmé el certificado del cliente usando el certificado del servidor, entonces, ¿por qué no funciona? Intenté descomentar la línea SSLCACertificateFile en ssl.conf, pero eso me devolvió al primer problema, que era la página cargada, pero sin reconocer el certificado del cliente. Así que una vez más vuelvo al punto de partida ... –