En el artículo Apache con SSL se indican los pasos para crear un certificado y utilizarlo para habilitar el acceso cifrado por HTTPS al servidor Apache. El único inconveniente es que el usuario del contenido cifrado recibirá en su navegador una advertencia ya que el certificado no ha sido emitido por ninguna autoridad de certificación (CA) y, por tanto, no hay forma de verificar la autenticidad del sitio web.
Si se ha comprado el certificado a una autoridad de certificación, entonces el resto del contenido del artículo es igualmente válido y la CA garantizará la validez del certificado.
Si no se desea comprar un certificado se puede crear una CA propia para un entorno determinado siguiendo los siguientes pasos.
Creación de una autoridad de certificación (CA) raíz
En primer lugar se crea un directorio para todos los ficheros relacionados con la CA:
$ mkdir ~/ACME-CA
Se comprobará que el fichero /etc/ssl/openssl.cnf tiene en la variable dir el directorio creado.
A continuación se crea un certificado autofirmado para la CA. Para el nombre común (CN) se recomienda indicar algo como «Certificado raíz ACME».
$ openssl req -config /etc/ssl/openssl.cnf -new -x509 -keyout newreq.pem \ -out newreq.pem -days 365
Si durante la creación del certificado se recibe el error «unable to write ‘random state'» puede que previamente se haya intentado ejecutar openssl como root y el fichero ~/.rnd no permita la escritura al usuario que ejecuta openssl. Si es así bastará con hacer propietario al usuario correspondiente.
Una vez ejecutada la orden se tendrán en el fichero newreq.pem la clave privada (parte RSA PRIVATE KEY) y el certificado (parte CERTIFICATE). Cada una de estas partes se guardará en un fichero distinto, la clave en ~/ACME-CA/private/cakey.pem y el certificado en ~/ACME-CA/cacert.pem. A continuación se puede eliminar newreq.pem.
Instalación del certificado de la CA raíz como certificado raíz de confianza
Se puede proporcionar acceso al certificado raíz publicándolo en http://sitio.tld/ssl/cacert.crt para que cualquier visitante pueda instalarlo en su navegador. Hay que tener en cuenta que si alguien presenta una web falsa, en lugar de la legítima, también podría proporcionar su propio certificado raíz falso desde dicha web.
El fichero a publicar debe contener exclusivamente el certificado, éste se obtiene así:
$ openssl x509 -in cacert.pem -out cacert.crt
Una vez disponible el certificado, un usuario podrá descargarlo e importarlo en la lista de certificados raíz de CA de confianza.
Preparación de la CA raíz
Antes de crear el certificado que se utilizará para el cifrado hay que comprobar que se disponga en ~/ACME-CA de los siguientes directorios
newcerts private
y de los siguientes ficheros
index.txt serial
El fichero index.txt deberá estar vacío y el serial contener únicamente la cadena «01», sin las comillas, como siempre.
Creación del certificado del sitio
Ahora ya se puede crear un certificado emitido por la CA raíz propia y que será considerado válido por cualquier navegador que confíe en dicha CA raíz. Para ello se genera una clave privada y una solicitud de certificado en el fichero newreq.pem:
$ openssl req -config /etc/ssl/openssl.cnf -new -keyout newreq.pem \ -out newreq.pem -days 365
En este paso hay que proporcionar el nombre del sitio web (dominio sin protocolo ni directorios) para el que se genera el certificado en el campo «Nombre común» (CN), de lo contrario, los navegadores que accedan al sitio detectarán que el certificado no ha sido emitido para dicho sitio, aunque provenga de una CA raíz de confianza. Si lo que se desea es cifrar emails habrá que indicar la dirección de correo electrónico como nombre común.
Ahora se firma la solicitud con el certificado de la CA y se crea el certificado para el sitio. Habrá que proporcionar la clave del certificado cacert.pem.
$ openssl ca -config /etc/ssl/openssl.cnf -policy policy_anything \ -out newcert.pem -infiles newreq.pem
Esta orden provocará la creación del certificado en el fichero newcert.pem y en el directorio newcerts con el nombre xx.pem, donde xx será el número indicado en el fichero serial. La clave privada se guarda en newreq.pem. Los ficheros serial e index.txt también son actualizados para reflejar la creación del certificado.Instalación del certificado y la clave en Apache
Este paso ya corresponde con lo explicado en el artículo Apache con SSL, salvo que en esta ocasión se proporciona un fichero para la clave y otro para el certificado en vez de proporcionar ambos en un mismo fichero.
La clave utilizada por Apache no debe estar protegida por clave, por lo que hay que obtener una versión no segura de la calve generada:
$ openssl rsa -in newreq.pem -out wwwCLAVE-NO-SEGURA.pemEste fichero deberá estar de alguna forma protegido contra accesos no deseados.
Ahora se copian los ficheros newcert.pem y wwwCLAVE-NO-SEGURA.pem a alguna ruta accesible por Apache y se configura para utilizarlos en el fichero de configuración de Apache correspondiente:
# Server Certificate: # Point SSLCertificateFile at a PEM encoded certificate. If # the certificate is encrypted, then you will be prompted for a # pass phrase. Note that a kill -HUP will prompt again. A test # certificate can be generated with `make certificate' under # built time. #SSLCertificateFile conf/ssl/ca.crt SSLCertificateFile sitio.tld.cert.pem # Server Private Key: # If the key is not combined with the certificate, use this # directive to point at the key file. #SSLCertificateKeyFile conf/ssl/ca.key.unsecure SSLCertificateKeyFile wwwCLAVE-NO-SEGURA.pem
Un reinicio del servidor Apache y los navegadores que visiten el sitio detectarán que el certificado ha sido emitido por la CA raíz creada y, si confían en ella, admitirán el certificado como válido sin advertir al usuario sobre posibles riesgos.$ sudo service apache2 restarto
$ sudo /etc/init.d/apache2 restartSi el servidor Apache falla al reiniciar puede que se deba a que no localiza el fichero de clave o el de certificado. Habrá que comprobar si la ruta proporcionada es válida y, si lo es, el contenido de los ficheros.
Referencias
Corregidos los enlaces.