Howto crear certificado SSL para apache
Contenidos
1. Introducción
2. Pasos previos
3. Creación de una CA (Autoridad Certificadora)
4. Creando el certificado digital
1. Generar la petición de certificado
2. Emitir el certificado
5. ultimas configuraciones
6. Evitar petición de Passwd
1. Introducción
Con este Howto veremos como certificar digitalmente un Apache con SSL (crear un sitio certificado bajo SSL (https) con apache). Todo el manual lo he escrito teniendo en cuenta que estamos loggeados como root.
2. Pasos previos
Partiendo de la base de que las maquinas sean de tipo Debian comenzamos con la explicación:
Ejecutar apt-get update para actualizar la lista de paquetes, apt descargará descripciones de los lugares indicados en /etc/apt/sources.list.
apt-get update
Buscamos el paquete que necesitamos:
apt-cache search openssl
Instalamos:
apt-get install openssl
Ya tenemos la herramienta openssl con la cual podremos crear nuestros certificados digitales, de forma libre.
3. Creación de una CA (Autoridad Certificadora)
Para comenzar nos situamos en el directorio root de nuestro servidor web, en mi caso /var/www/joomla, creamos una carpeta ya que los comandos que ejecutaremos generan ficheros y es prudente tenerlos ordenados:
mkdir CA
cd CA
Con este comando creamos un CA para certificados X509 con algoritmo de encriptación rsa de 2048 bytes. Con el -keyout le indicamos que la clave privada de nuestra CA se almacene en el fichero cakey.pem y la clave publica -out en el cacert.pem.
Seguidamente nos pedirá un password para nuestra CA y se lo damos (Apuntarlo o memorizarlo ya que sirve para los próximos pasos). También nos pedirá una serie de datos por ejemplo país, nombre de empresa, que nos identifica como CA.
Observar que le he añadido el parámetro -days con 3650, de esta manera indicamos que la CA no expire en 10 años.
openssl req -x509 -newkey rsa:2048 -keyout cakey.pem -days 3650 -out cacert.pem
4. Creando el certificado digital
Podremos hacer tantos como queramos los pasos son los mismos, a partir de ahora:
Primero generamos la clave privada del que sera nuestro certificado digital:
Con esto generamos la clave privada la cual tendrá un algoritmo de cifrado triple des (-des3) de 2048 y se almacenara en el fichero (-out) serv-priv.pem y con el comando -passout pass: indicamos la passfrase para nuestra clave privada yo le he puesto mipassword (en el ejemplo). Teniendo en cuenta que el algoritmo solo se puede reventar a fuerza bruta es importante tener en cuenta que entre mas digitos tenga la clave mas tiempo tardaran e descifrarla.
openssl genrsa -des3 -out serv-priv.pem -passout pass:mipassword 2048
4.1. Generar la petición de certificado
Ahora vamos a generar la petición del certificado, antes de hacer un certificado , hay que hacer una petición donde se define el propietario del certificado.
openssl req -new -subj “/DC=shadowsland.com/OU=com/CN=shadowsland” -key serv-priv.pem -passin pass:mipassword -out petic-certificado-serv.pem
Observamos que le indicamos (req -new) con lo que indicamos que es una petición con el parámetro -subj le indicamos a quien pertenece el certificado, para ello ponemos entre comillas cada uno de los apartados que identifican separados por / , observar que yo he usado shadowsland, vosotros ponéis vuestro servidor o lo que sea. A la petición le indicamos que usara la clave privada que hemos hecho en el anterior comando -key serv-priv.pem y le indicamos el password que usemos en el anterior (-passing pass):mipassword y como salida (-out)le indicamos que genere el siguiente fichero petic-certificado-serv.perm
4.2. Emitir el certificado
Finalmente ya podemos emitir el certificado. Para definir las características de un certificado openssl dispone del directorio /etc/ssl donde hay un fichero openssl.cnf con lo que podemos definir las características. Pero hay una forma mas simple de darle estas características, mediante la generación de un fichero de configuración por parte nuestra. Por tanto con VI o con nuestro editor favorito generamos un fichero que contenga lo siguiente:
basicConstraints = critical,CA:FALSE
extendedKeyUsage = serverAuth
Y lo guardamos por ejemplo con el nombre config1.txt , en el fichero le indicamos el basicConstraints =critical,CA:FALSE para que cumpla con el X509v3 y con la RFC3280, paja mental vamos. Lo ponemos y punto. Y también le indicamos que el certificado servirá para un servidor con lo siguiente extendedKeyUsage=serverAuth, por ejemplo un servidor web que es lo que queremos certificar.
Y ahora con el fichero hecho con la configuración hacemos el certificado:
openssl x509 -CA cacert.pem -CAkey cakey.pem -req -in petic-certificado-serv.pem -days 3650 -extfile config1.txt -sha1 -CAcreateserial -out servidor-cert.pem
Indicamos que sera un certificado del tipo x509 cuya CA (-CA) esta definida en el fichero cacert.pem (lo hemos hecho lo primero) y que usa como clave privada (-CAkey) el fichero cakey.pem y que el certificado a generar tendrá las especificaciones definidas en el apartado anterior (-req -in) las cuales están en el fichero de petición petic-certificado-serv.pem.
El certificado tendrá una validez de diez años (-days 3650).
Y le indicamos que el certificado es para un servidor, como esto lo tenemos en nuestro fichero de configuración se lo indicamos poniendo -extfile y nuestro fichero config1.txt y utilizaremos un algoritmo de cifrado SHA (-sha1).
Luego como es nuestro primer certificado le indicamos que la CA lo numere con lo cual le pondrá 2 , ya que el 1 es la CA -CAcreateserial y finalmente le decimos donde generar el certificado (-out) en el fichero servido-cert.pem
Una vez lanzado el comando nos pedirá el password de la CA que lo emite y el fichero se generará.
Ahora os listo los fichero generados solo los importantes que hemos generado , el resto se puede eliminar :
Por parte de la CA:
cacert.pem
cacert.srl
cakey.pem
Por parte del certificado:
servidor-cert.pem
serv-priv.pem
Utilidad:
config1.txt
5. ultimas configuraciones
tenéis que copiar los ficheros servidor-cert.pem y servidor-priv.pem en /etc/apache2/ssl si no disponéis del directorio ssl crearlo solo sirve para guardar esto en algún lado y que apache lo vea. Al apache2 hay que indicarle que también escuche por el puerto 443 que es el del Secure Socket Layer (ssl) para eso se modifica el fichero /etc/apache2/ports.conf para que ponga:
Listen 80
Listen 443
Ahora tenemos que decirle apache que soporte el ssl para ello instalamos el modulo ssl (en Ubuntu hay que abrir los repos universe):
apt-get install libapache-mod-ssl
Una vez instalado esto le decimos a apache que cargue el modulo, tecleando lo siguiente:
a2enmod ssl
Y con esto ya solo nos queda configurar nuestro fichero de sites-availables donde tenemos nuestra configuración para poder acceder a nuestro site mediante https.
Editamos el fichero /etc/apache2/sites-availables/default y creamos el virtual host adecuado para el puerto 443:
NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/local/mipagina
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/servidor-cert.pem
SSLCertificateKeyFile /etc/apache2/ssl/serv-priv.pem
ServerName mipagina.midominio.com
<Directory “/var/local/mipagina”>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Poniendo en el DocumentRoot el lugar donde tenemos nuestra pagina. Le indicamos que utilizamos certificados (SSLEngine on) y le decimos donde tiene que que leer el certificado (SSLCertificateFile) y la clave privada de este (SSLCertificateKeyFile). Si no queda algo claro de este tema consultar la instalación de apache de la pagina de jakarta.
Finalmente despues de guardar el fichero default nos vamos al /etc/apache2/sites-enabled y hacemos un vinculo simbólico al fichero default del sites-availables y le llamamos default-000:
ln -s ../sites-availables/default default-000
Ahora solo nos queda parar y arrancar nuestro apache
/etc/init.d/apache2 stop
/etc/init.d/apache2 start
Observareis que os pide password , el cual es el password de vuestro certificado.
6. Evitar petición de Passwd (no recomendable)
Observareis que os pide password , el cual es el password de vuestro certificado.Como lo del password puede ser un problema ya que ahora si la maquina se arranca y cuando arranque el apache, se quedara parado hasta metáis el password.
La solución trapera es ponerle en el fichero /etc/sites-availables/default una directiva (fuera de los virtual host) como la siguiente:
SSLPassPhraseDialog exec:/etc/apache2/generadorclave
Donde generadorclave es un fichero bash que creamos nosotros para que se invoque cuando apache arranque y le proporcione la clave. El contenido del fichero podría ser el siguiente:
#!/bin/sh
echo mipassword
Observar que simplemente es un echo con el password. Ahora solo le tenéis que dar permiso de ejecución.
chmod 700 generadorclave
Volvéis a generar lo del vinculo simbólico y volvéis a arrancar apache y ya podéis probar vuestro site poniendo en el navegador por ejemplo https://mipagina.midominio.com
On egin
Fuente de información