Requisitos:
- Tener instalado OpenSSL 1.0
- Tener instalado la JDK 1.8
Creación de una Autoridad Certificadora:
- Genera clave privada de la CA
openssl genrsa -des3 -out private/ca-private.key 2048
- Generar una petición de certificado para la propia CA
openssl req -new -key private/ca-private.key -out ca.csr -subj "/C=ES/ST=Asturias/L=Siero/O=RuBeNsA/OU=Departamento Seguridad/CN=rubensa.eu.org"
- Generar el certificado de la CA firmado por la propia CA
openssl x509 -signkey private/ca-private.key -req -days 3650 -in ca.csr -out public/ca.crt
Creación de un certificado de servidor:
- Crear un almacén de claves con la clave privada del servidor
keytool -genkeypair -keystore private/server.p12 -storetype PKCS12 -alias server -keyalg RSA -keysize 2048 -dname "CN=rubensa.eu.org,OU=Departamento Seguridad,O=RuBeNsA,L=Siero,S=Asturias,C=ES" -ext san=dns:rubensa.eu.org,dns:localhost,ip:127.0.0.1
- Generar una petición de certificado
keytool -certreq -alias server -keystore private/server.p12 -storetype PKCS12 -file server.csr
- Generar un certificado firmado por la CA (si existe previamente el fichero «serial.txt» eliminar -CAcreateserial)
openssl x509 -req -days 365 -in server.csr -CA public/ca.crt -CAkey private/ca-private.key -CAcreateserial -CAserial serial.txt -out public/server.crt
- Importar el certificado de la CA en el almacén de claves del servidor
keytool -import -alias CA -file public/ca.crt -keystore private/server.p12 -storetype PKCS12
- Importar el certificado firmado del servidor en el almacén de claves
keytool -import -alias server -file public/server.crt -keystore private/server.p12 -storetype PKCS12
- Exportar la clave privada del servidor
openssl pkcs12 -in private/server.p12 -nodes -nocerts -out private/server-private.key
- Exportar la clave pública del servidor
openssl rsa -in private/server-private.key -pubout > public/server-public.key
Creación de un certificado de cliente (con estructura de DNI electrónico):
- Generar la clave privada del cliente
openssl genrsa -des3 -out private/client-private.key 2048
- Crear un fichero «dnie.cnf» con el siguiente contenido
[ req ]
distinguished_name = req_distinguished_name[ req_distinguished_name ]
countryName = Pais (2 letras)
countryName_default = ES
countryName_min = 2
countryName_max = 2commonName = Apellido1 Apellido2, Nombre (AUTENTICACIÓN|FIRMA)
commonName_max = 64givenName = Nombre
surname = Apellido1
serialNumber = NNNNNNNNA (número de DNI con letra)
serialNumber_min = 9
serialNumber_max = 9 - Generar una petición de certificado
openssl req -config dnie.cnf -new -key private/client-private.key -out client.csr
- Generar un certificado firmado por la CA (si no existe previamente el fichero «serial.txt» añadir -CAcreateserial)
openssl x509 -req -days 365 -in client.csr -CA public/ca.crt -CAkey private/ca-private.key -CAserial serial.txt -out public/client.crt
- Generar un fichero pkcs12 para importar el certificado en el navegador
openssl pkcs12 -export -clcerts -in public/client.crt -inkey private/client-private.key -out private/client.p12 -name "client"
Creación de un truststore (un almacén de claves en el que ir guardar los certificados en los que el servidor «confía»):
- Crear un keystore
- Importar el certificado del CA (de tal modo que cualquier certificado de cliente firmado por la CA sea válido)
keytool -importcert -alias CA -file public/ca.crt -keystore private/truststore.p12 -storetype PKCS12 -keyalg RSA -keysize 2048
Nota: Para poder consultar los certificados existentes en un keystore podemos utilizar el siguiente comando
keytool -v -list -keystore private/server.p12 -storetype PKCS12
Algunos enlaces de interés
Receta para la creación de certificados de prueba desde cero
Steps to generate self-signed PKCS#12 SSL certificate and export its keys