Foros del Web » Programando para Internet » PHP »

LEER-VALIDAR Certificados digitales personales con PHP

Estas en el tema de LEER-VALIDAR Certificados digitales personales con PHP en el foro de PHP en Foros del Web. Hola. Estoy intentando validar una web con certificados digitales personales, en concreto de la FNMT. El tema para mi es algo nuevo y sinceramente es ...
  #1 (permalink)  
Antiguo 19/04/2016, 01:55
 
Fecha de Ingreso: septiembre-2009
Mensajes: 84
Antigüedad: 14 años, 7 meses
Puntos: 2
LEER-VALIDAR Certificados digitales personales con PHP

Hola.

Estoy intentando validar una web con certificados digitales personales, en concreto de la FNMT.

El tema para mi es algo nuevo y sinceramente es bastante informacion por eso recurro a vosotros a ver si podeis echarme una mano

Necesito que mediante los certificados digitales que el usuario instala en el navegador este valide contra una base de datos mediante PHP.

He conseguido leer la informacion del certificado que esta en la misma carpeta o subiendoselo mediante un input con las funciones de las que dispone php de openssl en modo de navegacion no https. Asi:

Código:
<?php 
if (getenv('HTTPS')=='on'){ 
   $cert=$_SERVER['SSL_CLIENT_CERT']; 
 }else{ 
   	$fname = "nombreCert.p12";
 	$f = fopen($fname, "r"); 
   
 $cert = fread($f, filesize($fname)); 
 fclose($f); 

 } 

 $datos = array();
 $pass = "pass";

 openssl_pkcs12_read($cert, $datos, $pass);
 $datos = openssl_x509_parse($datos['cert'],0);
 
 print_r($datos);
?>
Ahora necesito leer los que estan en el navegador instalados por lo que googleando he encontrado la forma de configurando Apache para que utilice SSL y al entrar en la web este requiera un certificado de cliente:

Código:
SSLVerifyClient require
He probado todo esto en un server CENTOS que tengo en una maquina virtual con apache-OpenSSL-mod_ssl.
Una vez entro en el php con el codigo que os he puesto arriba me solicita el certificado pero cuando lo selecciono me salta un error de

"Conexion segura fallida"....... La otra parte no reconoce o confia en....


Partiendo de mi desconocimiento la sensación es que estos manuales están hechos para validar certificados autofirmados con el mismo certificado de servidor creado por este.

Si alguien pudiera orientarme un poco sobre como validar un certificado instalado en el navegador mediante php segun su tipo le estaria muy agradecido. Lo mas importante en un principio que necesito es poder leer los datos de este certificado. Si luego puedo validarlo ya es un extra ;)

Seria algo asi como:

-Entrar a un .php
-Solicitar certificados de cliente instalados
-leer los datos de este
-Validarlos o no (por ejemplo los de la FNMT)

Muchas gracias
  #2 (permalink)  
Antiguo 19/04/2016, 03:18
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: LEER-VALIDAR Certificados digitales personales con PHP

Que quieres tener acceso a los certificados de cliente hechos para un dominio, desde otro dominio distinto??
Afortunadamente, eso va a ser imposible.
Suponte que fuera posible.Que tú pudieras, en tu web, leer mi certificado de la FNMT.O sea, que sepas mi nombre, apellidos, dirección, y toda la información que yo le doy a la FNMT. Digamos que...no.
No me meto en detalles, porque internet está lleno de información sobre ello (SSL user authentication) ...Pero, en tu código (que, por otro lado, no tiene nada que ver con lo que quieres hacer), que dices que funciona, por lo que querías hacer lo mismo pero para browser...Ves que metes un "pass"? De dónde obtendrías ese "pass"?
  #3 (permalink)  
Antiguo 19/04/2016, 04:16
 
Fecha de Ingreso: septiembre-2009
Mensajes: 84
Antigüedad: 14 años, 7 meses
Puntos: 2
Respuesta: LEER-VALIDAR Certificados digitales personales con PHP

Cita:
Iniciado por dashtrash Ver Mensaje
Que quieres tener acceso a los certificados de cliente hechos para un dominio, desde otro dominio distinto??
Afortunadamente, eso va a ser imposible.
Suponte que fuera posible.Que tú pudieras, en tu web, leer mi certificado de la FNMT.O sea, que sepas mi nombre, apellidos, dirección, y toda la información que yo le doy a la FNMT. Digamos que...no.
No me meto en detalles, porque internet está lleno de información sobre ello (SSL user authentication) ...Pero, en tu código (que, por otro lado, no tiene nada que ver con lo que quieres hacer), que dices que funciona, por lo que querías hacer lo mismo pero para browser...Ves que metes un "pass"? De dónde obtendrías ese "pass"?
Hola, ante todo muchas gracias por molestarte en contestar.

Primero no intento robar informacion a nadie

Creo haberme explicado bien, he dicho que tengo bastante desconocimiento en el tema y he estado leyendo bastante informacion al respecto pero es un tema bastante complicado y con una documentacion bastante densa. De ahi que pidiera algo de orientacion sobre como puedo empezar.

La aplicacion es una plataforma en la cual mediante certificados deberia poder autenticar usuarios frente a una base de datos, en mi caso tengo un certificado de la FNMT el cual con mi contraseña he podido probar que funciona leyendo sus datos.

Se que por ejemplo la FNMT cobra a terceros por validar un certificado pero otras entidades que expiden certificados personales no. Por lo que entiendo que se les puede "atacar/consultar" la validez/datos de un certificado de forma legal.

El codigo que he puesto lee correctamente los datos del certificado .p12, evidentemente configurandole mi contraseña de certificado.

Despues de leer varios manuales(que no comparto aqui por si es SPAM) en local y mediante una maquina virtual, he configurado apache para SSL creando un certificado de servidor autofirmado. Posteriormente he configurado apache para requiera certificado de cliente y funciona, es decir, con funciona quiero decir que salta el mensaje solicitando un certificado pero a partir ahi ya me pierdo

Se que existen librerias de terceros para PHP que mediante Applets Java realizan esto, por ejemplo "ViaFirma".

Se que hay cosas que ignoro y por eso lo mas probable es que este diciendo cosas "absurdas". Por eso recurria a vosotros a ver si podiais orientarme para que por mi mismo pudiera avanzar algo.

Última edición por Hanzo_lx; 19/04/2016 a las 04:23
  #4 (permalink)  
Antiguo 19/04/2016, 04:48
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: LEER-VALIDAR Certificados digitales personales con PHP

Cita:
Iniciado por Hanzo_lx Ver Mensaje
Hola, ante todo muchas gracias por molestarte en contestar.

Primero no intento robar informacion a nadie
Lo que tu, en particular, vayas a hacer, da lo mismo.Si cualquiera pudiera leer los certificados de cualquiera, no tendría mucho sentido que existieran.

Cita:
Iniciado por Hanzo_lx Ver Mensaje
La aplicacion es una plataforma en la cual mediante certificados deberia poder autenticar usuarios frente a una base de datos, en mi caso tengo un certificado de la FNMT el cual con mi contraseña he podido probar que funciona leyendo sus datos.
Tienes un certificado *personal*, del cual, usando su contraseña, puedes leer los datos.
El navegador no va a enviar ese certificado personal, a menos que previamente se valide la autenticidad del servidor.O sea, que tu seas la FNMT.Si no fuera así, de nuevo, para qué servirían los certificados?

Cita:
Iniciado por Hanzo_lx Ver Mensaje
Se que por ejemplo la FNMT cobra a terceros por validar un certificado pero otras entidades que expiden certificados personales no. Por lo que entiendo que se les puede "atacar/consultar" la validez/datos de un certificado de forma legal.
Te parecería lógico que el navegador, a un servidor cualquiera, le enviara *todos* los certificados personales que tengas, y que, no sólo eso, sino que esos certificados pudieras decodificarlos "gratuitamente", independientemente del emisor?
Internet sería un mundo bastante divertido.
  #5 (permalink)  
Antiguo 19/04/2016, 05:07
 
Fecha de Ingreso: septiembre-2009
Mensajes: 84
Antigüedad: 14 años, 7 meses
Puntos: 2
Respuesta: LEER-VALIDAR Certificados digitales personales con PHP

[QUOTE=dashtrash]


Tienes un certificado *personal*, del cual, usando su contraseña, puedes leer los datos.
El navegador no va a enviar ese certificado personal, a menos que previamente se valide la autenticidad del servidor.O sea, que tu seas la FNMT.Si no fuera así, de nuevo, para qué servirían los certificados?


De nuevo expresar que en este tema soy nuevo y tengo bastante desconocimiento el tema.

Llegue a la conclusión de que se podria hacer al ver la libreria esta que te he comentado. No se realmente como lo haran ellos. Salvo los de la FNMT, que hay que pagar, validan certificados y te permite extraer informacion de los certificados


Cita:
Iniciado por dashtrash Ver Mensaje

Te parecería lógico que el navegador, a un servidor cualquiera, le enviara *todos* los certificados personales que tengas, y que, no sólo eso, sino que esos certificados pudieras decodificarlos "gratuitamente", independientemente del emisor?
Internet sería un mundo bastante divertido.
Todos no, el que el usuario eligiera del listado de instalados y previa introduccion de password, como por ejemplo cuando vas a descargarte la vida laboral. Metes el DNIe seleccionas el certificado, la contraseña y entiendo que enviara la informacion del solicitante no?

Supongo que lo que estoy diciendo son peregrulladas :(
  #6 (permalink)  
Antiguo 19/04/2016, 05:08
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: LEER-VALIDAR Certificados digitales personales con PHP

Hola,

Hasta donde yo sé, lo que pretende Hanzo_lx es lo mismo que hacen por ejemplo en muchas de las páginas de organismos oficiales, por ejemplo http://www.seg-social.es o http://www.agenciatributaria.es/, lo que no tengo ni idea de cómo se puede hacer, pero de que se puede, eso seguro, de hecho esa es la finalidad de los certificados de usuario, poder autentificarse ante quien sea mediante una interfaz web.

Estaría bien saber cómo se puede hacer todo esto...
  #7 (permalink)  
Antiguo 19/04/2016, 05:23
 
Fecha de Ingreso: septiembre-2009
Mensajes: 84
Antigüedad: 14 años, 7 meses
Puntos: 2
Respuesta: LEER-VALIDAR Certificados digitales personales con PHP

Aqui o aqui un enlace sobre algo de informacion que encontre que me hizo pensar que se podria hacer. No se si estamos hablando de lo mismo

Quoteo info del segundo articulo el cual esta hecho especificamente para FNMT

Cita:
Vamos a ver un poco de la teoría para saber cómo funciona el tema de los certificados. Una vez que sepamos como funciona, entenderemos los pasos a dar. El circuito de los certificados es el siguiente:

1. El cliente accede a la url https://.... (para la cual es necesario un certificado de cliente)
2. El servidor envía su certificado al cliente para establecer el canal seguro. El cliente debe confiar en la entidad que ha generado ese certificado y comprobar que es válido. En caso de no confiar aparecerá un mensaje en el explorador indicándonoslo (la mayoría de la gente no lo lee).
3. Una vez que el cliente ha confiado en el servidor, se establece el canal seguro.
4. El servidor tiene configurado que para el recurso que intenta ver el cliente es necesario que presente un certificado de cliente, emitido por una entidad certificadora en la que él confíe y además que está en la lista de los certificados admitidos para el recurso en cuestión.
5. El explorador del cliente recibe estas condiciones del servidor y muestra una ventana con los certificados instalados que cumplan los requisitos del servidor.
6. El usuario elige su certificado y éste es mandado al servidor.
7. El servidor comprueba la lista de revocación de certificados de la entidad que emitió el certificado para ver si sigue siendo válido.
8. En caso que el certificado sea válido, podremos acceder al recurso y en la sesión tendremos guardado el certificado para usarlo.
No es esto lo que quiero hacer yo pero en vez de IIS, apache?

Última edición por Hanzo_lx; 19/04/2016 a las 05:31
  #8 (permalink)  
Antiguo 19/04/2016, 06:10
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: LEER-VALIDAR Certificados digitales personales con PHP

Por favor, lee bien esos documentos.
En el segundo documento, en qué momento se incluye código "de validación".

De la lista que has escrito, puntos 5 y 6:
Es el *explorador* el que muestra al usuario la lista de certificados.
Y, si el usuario está de acuerdo con enviar sus credenciales, elegirá él cuál de los certificados que tenga, va a usar.
Es una decisión del usuario, que, lógicamente, en segsocial.es, etc,etc, no tiene problema en autenticarse con ese certificado.

En ningún caso puedes tener un php que lea qué certificados tiene un usuario en su navegador, obtenerlos o "validarlos".Y, si lees bien el documento, el "validarlos" no tiene sentido.Si no es válido,no se cargaría el recurso destino.
  #9 (permalink)  
Antiguo 19/04/2016, 06:20
 
Fecha de Ingreso: septiembre-2009
Mensajes: 84
Antigüedad: 14 años, 7 meses
Puntos: 2
Respuesta: LEER-VALIDAR Certificados digitales personales con PHP

Vamos a ver, leerlo creo que lo he leido bien.

Si lees mis comentarios anteriores veras que he puesto que he configurado Apache para que solicite al usuario que seleccione EL. Un certificado de los que EL voluntariamente tiene instalados en el navegador.

Por otro lado se, que desde PHP no se puede acceder a los datos del navegador directamente. Por eso en Apache activas una opcion que una vez seleccionado el certificado este se manda al servidor y los datos de este se guardan en jna variable global de servidor que si se puede leer mediante PHP
  #10 (permalink)  
Antiguo 20/04/2016, 05:03
 
Fecha de Ingreso: septiembre-2009
Mensajes: 84
Antigüedad: 14 años, 7 meses
Puntos: 2
Respuesta: LEER-VALIDAR Certificados digitales personales con PHP

Despues de leer bastante informacion creo que lo he "conseguido" por lo menos a medias.

La dinamica es la siguiente:

-Configurar Apache para que funcione bajo SSL.
-Si no se dispone de certificado SSL reconocido crear uno autofirmado.
-Configurar en apache las entidades Certificadoras soportadas (la nuestra propia, la de la FNMT, la de la policia) descargando sus certificados raiz de sus webs.
-Instalar certificado cliente en navegador.
-Cuando se accede a la web "securizada" el navegador te solicita que selecciones un certificado de los instalados. Este debe estar reconocido por nuestro apache en la lista de entidades soportadas.
-Al seleccionar se envia a apache una copia del certificado y este lo transforma a variables globales de servidor, las cuales pueden ser accedidas mediante PHP.

Me queda por ver como validar cada uno de los certificados ya que por ejemplo la FNMT cobra por validarlos y hay que atacarles mediante OCSP responder a su LDAP.
Por lo menos la info del certificado(DNI,nombre,fecha caducidad..) ya la tenemos accesible para lo que necesitemos y todo legal porque a mi entender es el usuario quien decide entregarte la información para autenticar.

En esta web teneis la info sobre como configurar apache para tal menester y en esta la info sobre como tratar la informacion.

Espero que esto le sirva a alguien. ;)

Última edición por Hanzo_lx; 20/04/2016 a las 05:22

Etiquetas: certificados, digitales, personales
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:19.