Certificados, certificaciones, Entidades de Certificación
todo
- si no es https, redirección a https
- si no tiene certificado de CA ficticea, llevar a página donde descargar
Creación entidad certificadora
- Creación de clave privada:openssl genrsa -des3 -out CA_privada.key 4096 (poner contraseña) 
- Creación solicitud de certificado:openssl req -new -key CA_privada.key -out CA_solicitud.csr - rellenar los campos solicitados
- en Organizational y Common Name usar el nombre que se mostrará (aka «certMate»)
 
- Creación certificado:openssl x509 -days 3650 -signkey CA_privada.key -in CA_solicitud.csr -req -out CA_certificado.crt (pedirá la contraseña del CA_privado.key) 
se puede quitar la contraseña a una KEY con:
openssl rsa -in [original.key] -out [new.key]
Creación certificado servidor
- Creación de clave privada:openssl genrsa -out Servidor_privada.key 4096 
- Creación solicitud de certificado:openssl req -new -key Servidor_privada.key -out Servidor_solicitud.csr - rellenar los campos solicitados
- Common Name usar la URL del servidor que queremos certificar
 
- Creación certificado:openssl x509 -days 3650 -CA CA_certificado.crt -CAkey CA_privada.key -set_serial 01 -in Servidor_solicitud.csr -req -out Servidor_certificado.crt (pedirá la contraseña del CA_privado.key) 
Creación certificado cliente
- Generación clave privada:openssl genrsa -out Cliente_privada.key 4096 
- Generación solitud de certificado:openssl req -new -key Cliente_privada.key -out Cliente_solicitud.csr - en organizational y common name usar el nombre del usuario
 
- Generación certificado:openssl x509 -days 3650 -CA CA_certificado.crt -CAkey CA_privada.key -set_serial 02 -in Cliente_solicitud.csr -req -out Cliente_certificado.crt - los set_serial establecen un número de orden apra el control de los certificados de la CA
 
- exportación a pkcs12 (para importar en el navegador):openssl pkcs12 -export -out Cliente_certificado.pfx -inkey Cliente_privada.key -in Cliente_certificado.crt -certfile CA_certificado.crt 
.pfx to apache
- openssl pkcs12 -in domain.pfx -clcerts -nokeys -out domain.cer 
- openssl pkcs12 -in domain.pfx -nocerts -nodes -out domain.key 
formatos de los certificados
- DER: formato binario (Java, Macintosh)
- PEM: formato BASE64
- convertir de DER a PEM:openssl x509 -in nombre_del fichero_der -inform DER -out nombre_del_fichero_pem -outform PEM 
- Certificados de DNIe: http://www.dnie.es/seccion_integradores/certs.html
funciones PHP acceso certificados
<?php /* empezamos leyendo el fichero que contiene el certificado y recogiendo su contenido en una variable que llamaremos $cert */ $f = fopen("juan_certificado.cer", "r"); $cert = fread($f, 8192); fclose($f); /* la funcion openssl_x509_parse nos extrae los datos y los convierte en un array */ $datos = openssl_x509_parse($cert,0); ?>
<?php /* empezamos comprobando si la petición se hizo en modo seguro o no. La variable de entorno HTTPS recoge es condición. Si estamos en modo seguro recogerá en la variable cert el valor transferido en la peticion y en caso contrario leería el fichero de ejemplo que tenemos en el directorio cursophp y al que se accede en modo no seguro */ if (getenv('HTTPS')=='on'){ $cert=$_SERVER['SSL_CLIENT_CERT']; }else{ $f = fopen("juan_certificado.cer", "r"); $cert = fread($f, 8192); fclose($f); } /* Extraemos los datos del certificado usando nombres cortos para los índices */ $datos = openssl_x509_parse($cert,0); ?>
verificación validez DNIe
modificaciones apache
- en httpd.conf o ports.conf o apache2.conf:- añadirListen 443
- añadir o activarLoadModule ssl_module modules/mod_ssl.so- también puede activarse enmods-enabled
 
- añadirNameVirtualHost *:443
 
- en definición de nuevo VirtualHost:- sslvirtualhost.conf
- <VirtualHost *:443> SSLEngine On SSLOptions +StdEnvVars +ExportCertData SSLCertificateFile /etc/apache2/certificados/Server_Certificado.crt SSLCertificateKeyFile /etc/apache2/certificados/Server_Private.key SSLCACertificateFile /etc/apache2/certificados/CertificadosRaiz.crt DocumentRoot /home/www/ssl.intranet.havasww.es/public ErrorLog /home/www/logs/ssl.intranet.havasww.es-error.log CustomLog /home/www/logs/ssl.intranet.havasww.es-access.log common LogLevel warn <Directory "/home/www/ssl.intranet.havasww.es/public"> AllowOverride All Options -Indexes </Directory> <Directory "/home/www/ssl.intranet.havasww.es/public/solocerts"> SSLVerifyClient require SSLVerifyDepth 2 # para DNIe, son CA subordinadas de otra CA SSLRequire ( %{SSL_CLIENT_V_REMAIN}>="0" ) # certificado vigente </Directory> </VirtualHost> 
 - SSLOptions +ExportCertData → nos permite acceder a datos del certificado
- SSLOptions +StdEnvVars → nos permite acceder a variables relacionadas (<?php print getenv('SSL_CLIENT_S_DN');?>
- SSLCACertificateFile <path> → nos permite incorporar certificados de CA (reales o ficticias)
- SSLVerifyClient require → obliga a seleccionar un certificado para acceder (en este caso, al directorio solocerts)
- SSLVerifyDepth <n> → por si la CA ha delegado en otras subs-CA la certificación (como en DNIe)
- SSLRequire ( %{SSL_CLIENT_V_REMAIN}>=«0» ) → certificado no caducado- se pueden concatener varios requisitos con AND y OR