Generando cerficados SSL para apache:
El primer paso es crear la clave RSA privada. Será una clave de 2048 bits pues así lo están requiriendo los CA actualmente.
Usaremos varios archivos como fuente de numeros aleatorios lo que ayudará a hacer la clave más segura. Un buen formato son archivos texto comprimidos en formato gzip. La clave es generada usando el siguiente comando (file1 a file5 son los archivos a ser usados para mejorar los numeros aleatorios), en nuestro caso de ejemplo, yo usaré dos archivos binarios. En la vida real les recomiendo poner algunos archivos más
openssl genrsa -rand /usr/bin/lsattr:/bin/cat -out server.key 2048 26976 semi-random bytes loaded Generating RSA private key, 1024 bit long modulus ........++++++ .......++++++ e is 65537 (0x10001)
Aquí está generada la server.key, la clave privada de nuestro servidor.
Es muy importante mantener una copia de ésta clave pues es la base para la encriptación usando un certificado. De ser posible mantener un respaldo en un disquete o cinta. El costo de un certificado,aunque varía, está entre los 30 a 600usd/año aproximadamente y es sumamente doloroso tener que regenerar un certificado nuevamente por no haber guardado los archivos utilizados para la generación de éste.
Ahora procedamos a generar una petición de certificación (Certificate Signed Request). Con esta podremos realizar la petición de un certificado a la entidad certificadora de nuestra elección. Este es el archivo que se les envía cuando ellos solicitan el CSR. Sin embargo, también podemos hacer que nuestro sistema genere un Certificado AutoGenerado el cual nos permitirá operar de forma segura, pero siempre le sacará a los clientes una advertencia de que el certificado no puede ser validado en una entidad certificadora.
En negrita está lo que nosotros debemos ir escribiendo. El ejemplo es para Quito, Pichincha, Ecuador, pero debe ponerse los datos de su organización propiamente dichos.
openssl req -new -key server.key -out server.csr What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:EC State or Province Name (full name) [Berkshire]:Pichincha Locality Name (eg, city) [Newbury]:Quito Organization Name (eg, company) [My Company Ltd]:EcuaLinux Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or your server's hostname) []:www.ecualinux.com Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Cuando vayamos a comprar un certificado, enviaremos éste archivo a la entidad certificadora. Ahora, como esto toma un tiempo y cuesta dinero, procedamos nosotros a generarnos un certificado autogenerado a partir de estos datos y seguir operando hasta que idealmente nos llegue el certificado válido. Este certificado de ejemplo será válido por 60 días, podemos poner más (1400 o algo así) si es que nunca vamos a pedir un certificado válido a una entidad certificadora.
openssl x509 -req -days 60 -in server.csr -signkey server.key -out server.crt Signature ok subject=/C=EC/ST=Pichincha/L=Quito/O=Ecualinux/OU=IT/CN=www.midominio.com/[email protected] Getting Private key
Listo.. ya tendremos nuestro certificado autogenerado.
En el caso de que hayamos solicitado un certificado de autenticidad a una entidad certificadora:
Es éste certificado el que nos enviaría una entidad certificadora para que usemos. Cuado lo envían, normalmente lo hacen en el cuerpo del mensaje, lo que tenemos que hacer realmente es crear un nuevo archivo llamado server.crt y pegarle todos los datos que nos indiquen.
Instalando el certificado en apache
primero verificar que apache y mod_ssl estén instalado, estos dos paquetes son necesarios para trabajar con ssl en apache:
rpm -q httpd mod_ssl
Si no están instalados, instalarlo conjuntamente con el php y el módulo para el manejo de ssl:
yum install php php-imap php-mysql httpd mod_ssl
probemos que el apache arranque
service httpd restart
Procedemos entonces a copiar nuestro certificado y clave privada hacia los directorios adecuados en CentOS-6, si se fijan les cambio de nombre a localhost.crt y localhost.key pues así los tiene configurado mod_ssl y no quiero estarle cambiando a mod_ssl.
[root@laptop ~]# cp server.crt /etc/pki/tls/certs/localhost.crt [root@laptop ~]# cp server.key /etc/pki/tls/private/localhost.key [root@laptop ~]# service httpd restart Stopping httpd: [FAILED] Starting httpd: [ OK ]
y listo.. ya tenemos nuestro certificado instalado para esa IP del servidor.
Verificando el certificado instalado
Entras por https://laipdetuservidor
Te dirá que el certificado no es válido y tiene lógica porque es autogenerado. Te vas a las propiedades del certificado y saldrá la información que pusiste.
Si te fallara la conexión puede deberse a varias razones, te expongo las más típicas aquí:
- Verifica que el httpd esté corriendo: service httpd status. Si no está corriendo es porque algún error hay en la configuración o has copiado el archivo incorrecto (algunas personas copian el .key como .crt y al revés, el .crt como .key)
- Verifica que tengas el puerto 443/TCP abierto en tu firewall, como solución de emergencia puedes apagar el iptables: service iptables stop, y si ahi funciona, es porque el firewall te está bloqueando el puerto 443/TCP… lógicamente deberás configurar el firewall para que el puerto 443/TCP quede abierto pues es a través de este puerto que funciona el https