Configurar TLS/SSL en Apache para sitios HTTPS

Author
Por Darío Rivera
Publicado el en Apache

HTTPS (Protocolo de transferencia de hypertexto seguro) es un protocolo principalmente usado en transferencia de datos entre un navegador y un sitio web. La principal ventaja de este protocolo es que los datos no viajen en claro sino que se transfieran encriptados, lo que hace casi imposible su identificación mediante sniffers o herramientas de análisis de tráfico de red.

El protocolo utilizado por HTTPS para cifrar la información es denominado TLS (Transport layer security), antiguamente conocido como SSL (Secure sockets layer). Este protocolo asegura la confidencialidad de la información utilizando criptografía asimétrica o de llave pública así como también infraestructura de llave pública.

En este post, verás cómo configurar apache para exponer un certificado TLS en tu sitio web y que pueda ser accedido mediante HTTPS.

Configuración Apache

Lo primero que debes hacer es agregar la siguiente línea para escuchar peticiones por el puerto 443.

Listen 443

Ahora debes habilitar los módulos de apache ssl y socache_shmcb. Esto lo debes hacer en el archivo de configuración de apache http.conf. Si no sabes dónde está localizado este archivo puedes averiguarlo con el siguiente comando.

apachectl -D DUMP_INCLUDES

Seguido a esto debes buscar en caso de que exista un archivo de configuración de ssl o una sección en el archivo principal como la siguiente:

<IfModule ssl_module>
...
</IfModule>

En este caso, deberás agregar una configuración inicial como la isguiente:

SSLRandomSeed startup builtin
SSLRandomSeed connect builtin

SSLSessionCache         shmcb:/var/run/ssl_scache(512000)
SSLSessionCacheTimeout  300

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl

SSLCipherSuite HIGH:!aNULL
SSLProtocol all -SSLv3

Configuración de sitio

Para configurar un sitio con TLS basta realizar la misma configuración que realizas habitualmente con la diferencia que debes agregar el puerto 443 y los paths del certificado y llave privada así:

<VirtualHost *:443>

    SSLEngine on
    SSLCertificateFile "/etc/ssl/ca_evtc/newcerts/C001.pem"
    SSLCertificateKeyFile "/etc/ssl/ca_evtc/keys/C001.pem"

    ...

</VirtualHost>

Verificación

Para verificar que el certificado ha sido expuesto, se puede utilizar openssl. El siguiente comando muestra el certificado de entidad final configurado para pleets.org.

$ openssl s_client -connect pleets.org:443 -servername pleets.org < /dev/null 2> /dev/null | \
   awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/'

También puedes obtener toda la cadena de certificados con el siguiente comando:

openssl s_client -showcerts -connect pleets.org:443 -servername pleets.org

Problemas Comunes

Aun cuando el certificado de entidad final ha sido expuesto de manera correcta, es importante verificar que toda la cadena de certificados funciona. Algunos navegadores completan los certificados intermedios faltantes, pero esto no es una regla para todos. Para verificar que toda la cadena es correcta, presta atención a las primeras lineas del comando anterior.

CONNECTED(00000003)
depth=3 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=2 C = US, O = ISRG, CN = Root YR
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = YR2
verify return:1
depth=0 CN = pleets.org
verify return:1

El servidor envía 3 certificados:

  • Leaf — pleets.org
  • Intermedio — Let's Encrypt YR2
  • Intermedio/root cruzado — ISRG Root YR

Para cada uno verify return:1, significa que openssl ha podido verificar el certificado.

Corrección del certificado intermedio

Una configuración incorrecta de un certificado intermedio podría verse de la siguiente manera.

CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1
depth=0 CN = example.com
verify return:1
---
Certificate chain
 0 s:CN = example.com
   i:C = US, O = Amazon, CN = Amazon RSA 2048 M04
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jun 23 00:00:00 2026 GMT; NotAfter: Jan  6 23:59:59 2027 GMT

En este caso, se ha configurado un certificado de entidad final (leaf) de Amazon AWS sin su certificado intermedio. Para solucionar esto, basta descargar el certificado y agregarlo a la cadena de certificados. Para esto, primero se debe obtener información de la entidad emisora. El siguiente comando mostrará información acerca de dónde está publicado dicho certificado.

$ echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | \
   openssl x509 -noout -ext authorityInfoAccess

Obtendrás una salida similar a la siguiente:

Authority Information Access: 
    OCSP - URI:http://ocsp.r2m04.amazontrust.com
    CA Issuers - URI:http://crt.r2m04.amazontrust.com/r2m04.cer

En donde:

  • OCSP → URL de revocación de certificados
  • CA Issuers → URL del emisor (certificado de la CA/intermedio)

Con esto ya se puede descargar el certificado y convertirlo al formato correcto.

$ curl -fsSL -o intermediate.crt \
  "http://crt.r2m04.amazontrust.com/r2m04.cer"
$ openssl x509 -inform DER -in intermediate.crt -out intermediate.pem

En Apache, esta configuración va casi siempre en la directiva SSLCertificateChainFile.


Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.