Certificados de Servidor con Keytool y OpenSSL para IE7
Índice de contenido
1. Introducción
En varios tutoriales ya hemos visto como generar certificados de servidor para dar soporte SSL en distintos servidores. El motivo de este tutorial es crear un certificado de servidor con la herramienta “keytool” de java y “OpenSSL” que sea válido en un navegador IE7, ya que hemos detectado que certificados generados por otros métodos pueden no ser aceptados por IE7, impidiendo el acceso a nuestras páginas.
2. Entorno
El tutorial se ha escrito bajo el siguiente entorno:
- Hardware: Portatil Samsung R70 ( Intel(R) Core(TM)2 Duo 2,5Ghz, 2046 MB RAM, 232 Gb HD)
- Sistema Operativo: Windows Vista Home Premium
- Máquina Virtual Java: JDK 1.5.0_14 de Sun Microsystems
- OpensSSL 0.9.8g
3. Crear la CA
Realmente no es necesario que tengamos nuestra propia CA para emitir los certificados, ya que podríamos utilizar los servicios que nos ofrecen varias CA’s como VeriSign, FNMT, etc. Casi todas ellas previo pago.
Lo que vamos a ver en este punto es como crearnos nuestra propia CA, de forma que podamos emitir el certificado del servidor nosotros mismos.
Para crearnos nuestra “pequeña” CA necesitamos una herramienta como OpenSSL que nos ofrece un conjunto de herramientas criptográficas open source que podemos descargar de https://www.openssl.org/source/.
3.1 Instalación de OpenSSL
El proceso de instalación de OpenSSL para Windows es muy sencillo, tendremos el clásico asistente donde tendremos que aceptar la licencia y seleccionar el destino donde queremos instalar.
Nota: Para facilitar la ejecución de los comandos de OpenSSL añadimos el directorio “bin” del OpenSSL a la variable de entorno “PATH”. En nuestro caso añadimos “C:\OpenSSL\bin”.
3.2 Crear estructura de la CA
Aunque no es necesario crear una estructura determinada para gestionar los certificados y peticiones de la CA, siempre es conveniente tener una estructura adecuada para organizar la información que gestionamos.
Para esto nos vamos a crear un directorio para nuestra CA en “C:\autentiaCA”, y dentro creamos los siguientes directorios:
- keys: Directorio donde guardaremos las claves generadas.
- request: Directorio donde guardaremos las peticiones (CSR’s) de nuevos certificados.
- certs: Directorio donde se guardarán los nuevos certificados.
- crl: Directorio donde guardaremos las listas de certificados revocados.
También crearemos dos ficheros más en el directorio de nuestra CA:
- database.txt: Sirve como base de datos para los certificados emitidos. El fichero lo crearemos vacío.
- serial.txt: Sirve para llevar un control del número de serie para los certificados emitidos. El fichero lo crearemos con la cadena “00” en la primera línea.
- crlNumber.txt: Sirve para llevar un control del número de serie para las listas de certificados revocados. El fichero lo crearemos con la cadena “00” en la primera línea.
3.3 Generar el certificado de la CA
Ahora generaremos el certificado de nuestra CA. Abrimos una consola de comandos y nos situamos en el directorio de nuestra CA. Primero crearemos el par de claves con el comando:
- -out: Es la ubicación donde generar el fichero para el par de claves.
- 1024: Tamaño de las claves.
Una vez tenemos las claves de nuestra CA, tenemos que crear un certificado público X509 que distribuiremos para que los diversos clientes reconozca a nuestra CA y. Para generar el certificado lo hacemos con:
- req: Petición para un CSR.
- -new: Nueva petición.
- -X509: Tipo de certificado.
- -days: Duración de la validez del certificado.
- -key: Fichero con el par de claves asociadas al certificado. (Nota:En el certificado X509 solo se incluye la clave pública)
- -out: Ubicación del certificado generado.
Durante el proceso de generación nos preguntará los datos públicos que va a tener el certificado de la CA (país, ciudad, organización, etc.)
4. Establecer SSL en un servidor
Para establecer una comunicación segura en nuestro servidor necesitaremos tener un certificado de servidor que sirva tanto para identificar al propio servidor como para cifrar la comunicación entre el servidor y los clientes que se conecten al mismo. En los siguientes puntos vamos a ver como generar nuestras claves de servidor, y como conseguir un certificado para dichas claves.
4.1 Generar las claves del servidor
En nuestro caso vamos a generar las claves utilizando la herramienta “keytool” de Java y fichero de claves del tipo Java Key Store (JKS).
Para la generación de las claves de servidor ejecutamos:
- -genkey: Petición para generar el par de claves.
- -alias: Nombre con el que haremos referencia al par de claves creado.
- -keypass: Contraseña de acceso a la clave privada.
- -storepass: Contraseña de acceso al fichero JKS.
- -keystore: Fichero JKS donde almacenar el par de claves.
- -keyalg: Algoritmo para el par de claves.
Nota: En algunos servidores es necesario que la contraseña de acceso al par de claves tiene que ser la misma que la contraseña de acceso al almacén de claves JKS.
4.2 Generar CSR
Ahora tenemos que generar un fichero CSR (Certificate Signing Request) para que la CA emita un certificado asociado al par de claves que hemos generado. Para conseguir el CSR ejecutamos:
- -certreq: Opción para generar una nueva petición de certificado (CSR).
- -alias: Nombre con el que haremos referencia al par de claves creado.
- -keypass: Contraseña de acceso a la clave privada.
- -storepass: Contraseña de acceso al fichero JKS.
- -keystore: Fichero JKS donde almacenar el par de claves.
- -file: Ubicación del fichero CSR a generar.
4.3 Enviar petición a la CA y firmar con la CA
Una vez hemos generado nuestra petición para un nuevo certificado hay que enviarlo a una CA para que nos emita un nuevo certificado.
En nuestro caso utilizaremos la CA que nos hemos creado, pero antes de generar el certificado debemos retocar el fichero de configuración “openssl.cnf”. Este fichero se encuentra en el directorio “bin” donde hayamos instalado el OpenSSL (en nuestro caso “C:\OpenSSL\bin\openssl.cnf”); haremos una copia de este fichero al directorio de nuestra CA (en nuestro caso “C:\autentiaCA\openssl.cnf”). Ahora tenemos que modificar algunos parámetros de la sección “[CA_default]” quedando los parámetros modificados:
- dir = . # Where everything is kept
- certs = $dir/certs # Where the issued certs are kept
- crl_dir = $dir/crl # Where the issued crl are kept
- database = $dir/database.txt # database index file.
- new_certs_dir = $dir/certs # default place for new certs.
- certificate = $dir/certs/ca.cert # The CA certificate
- serial = $dir/serial.txt # The current serial number
- crlnumber = $dir/crlNumber.txt # the current crl number
- crl = $dir/crl/crl.pem # The current CRL
- private_key = $dir/keys/ca.key# The private key
Ahora generaremos nuestro certificado X509 para el servidor con el comando:
- ca: Indica que actúe como una CA.
- -in: Ubicación del fichero CSR de petición.
- -out: Ubicación del certificado generado.
- -config: Ubicación del fichero de configuración de OpenSSL.
- -policy: Política que se utiliza para la firma de certificados.
Esto nos generará el certificado de nuestro servidor y queda llevarlo de vuelta a nuestro almacén de claves JKS que utiliza el servidor.
4.4 Instalar la respuesta de la CA
El formato del certificado de servidor que hemos generado con OpenSSL no lo podemos importar directamente, tenemos que “limpiarlo” para quedarnos sólo con la parte comprendida entre “—–BEGIN CERTIFICATE—–” y “—–END CERTIFICATE—–” con ambas líneas incluidas. Esto lo podemos hacer bien copiando y pegando en un nuevo fichero o ejecutando el siguiente comando:
- -in: Ubicación del certificado de servidor que hemos generado.
- -outform: Formato de la salida.
- -out: Ubicación del fichero de salida.
Antes de importar el certificado de servidor a nuestro JKS, deberemos importar el certificado público de la CA y marcarlo como de confianza. Esto lo hacemos ejecutando:
- -import: Acción de importación.
- -alias: Alias que damos al certificado de la CA.
- -keypass: Clave de acceso que damos para acceder al certificado de la CA.
- -file: Ubicación del certificado de la CA.
- -storepass: Contraseña de acceso al fichero JKS.
- -keystore: Ubicación del fichero JKS.
Por último sólo nos queda importar el certificado de nuestro servidor con el comando:
Para comprobar que en nuestro almacén de claves JKS tenemos todas las claves necesarias hacemos un listado del mismo:
- -list: Opción de listado.
- -v: Opción “verbose”.
- -storepass: Contraseña de acceso al almacén de claves JKS.
- -keystore: Ubicación del almacén de claves JKS.
5 Conclusiones
En este tutorial hemos visto un método para crear un certificado de servidor con “keytool” y “OpenSSL”, aunque existen muchos otros métodos para crear certificados igualmente válidos. Sea cual sea el método en el que hemos generado nuestro certificado hay que tener en cuanta los siguientes puntos para evitar las alertas de seguridad que nos muestran los clientes al conectarse a un servidor seguro:
- El nombre del certificado (CN, Common Name), a quién está emitido, debe coincidir con el nombre del dominio del servidor (p.e. www.adictosaltrabajo.com).
- Los certificados tienen un periodo de validez, por lo que siempre debe haber un responsable que se encargue de gestionar los certificados y asegurarse que no han caducado.
- Los clientes deben confiar explícitamente en la CA que ha emitido el certificado del servidor. En el caso de CA’s conocidas suelen venir instalados por defecto sus certificados públicos para que nuestros clientes confíen en los certificados que emiten. Si hemos emitido el certificado del servidor con nuestra propia CA, tendremos que instalar el certificado público de nuestra CA en todos los clientes que se conecten a nuestro servidor si queremos que no les aparezca la alerta de seguridad.
Hola! el tutorial esta muy bien, pero a mi me sale un error cuando ejecute el comando del paso 4.3
el error es el siguiente
Loading \\\’screen\\\’ into random state – done
unable to load number from ./serial.txt
error while loading serial number
2444:error:0D066096:asn1 encoding routines:a2i_ASN1_INTEGER:short line:.\\\\crypto\\\\asn1\\\\f_int.c:215:
cual puede ser el motivo?
saludos
uffff!1 pues ya hace unos cuantos años desde que hice este tutorial, pero a primera vista lo que se me ocurre es que el fichero con los número de serie esté corrupto. Si no recuerdo mal, tiene que existir el fichero ser un fichero de texto plano que como contenido del fichero lo único que debe haber es un número.
Revisate el fichero y comprueba que no tienes problemas con la codificación.
Un saludo
Exelente Tutorial, Saludos desde Montevideo Uruguay.
ecelente tutorial pero… sigue dando error de conexion no segura en tomcat 😀
SEC_ERROR_UNKNOWN_ISSUER