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.pem

Este 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 restart

o

$ sudo /etc/init.d/apache2 restart

Si 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

SSL Certificates HOWTO

1 comentario en “Apache con certificado emitido por CA propia

Dejar una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes utilizar estas etiquetas y atributos HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.