Tabla de Contenidos

Certificado SSL

Este es un compendio general de cómo obtener un certificado SSL para un subdominio de Helpcom y conectar ese certificado en un servidor. Está basado en las herramientas certbot y acme.sh y sus documentaciones oficiales:

Requisitos Generales:

Para instalar Certbot en Debian 11 en adelante se puede hacer sin problemas desde el gestor de paquetes:

apt install certbot

Para instalar acme.sh se puede clonar el repositorio oficial.

git clone https://github.com/acmesh-official/acme.sh.git

Para configurar el servidor web correspondiente (Apache o Nginx) se recomienda seguir las recomendaciones oficiales. En particular, para Certbot se recomienda crear un depósito de certificados bajo el árbol de directorios del servicio web (ej.: /etc/apache2/certbot) y para configurar acme.sh se recomienda habilitar el modo Stateless para simplificar la fase de challenge al pedir un certificado singular de subdominio y crear también su ruta de certificados correspondiente (ej.: /etc/apache2/certacme).

Tomar nota que los repositorios de devops-stag y devops-erebor vienen con ejemplos de archivos de configuración para ayudar a configurar acme-challenge y este tutorial asume que esos archivos han sido instalados.

Case 1: Subdominio directo

En este caso tenemos un proyecto web en HTTP que es alcanzable bajo miproyecto.helpcom.cl y que corre en uno de los recursos de IPs públicas a las que tiene acceso Helpcom (ej.: Erebor).

Requisitos:

httpd

El servicio web debe tener habilitado un archivo de configuración de acme-challenge, basado en el correspondiente en devops-stag o similar. Este archivo suele ser:

VirtualHost

Se asume que el VirtualHost tiene una estructura similar a la siguiente en un archivo de virtualhost:

Apache - sites-available/miproyecto.helpcom.cl.conf (el cual debe estar activado con a2ensite):

<VirtualHost *:80>
	ServerName miproyecto.helpcom.cl
	UseCanonicalName Off

	ErrorLog ${APACHE_LOG_DIR}/miproyecto.log
	# debería estar cubierto por acme-challenge.conf
	# Alias /.well-known/acme-challenge  /var/www/.acme

	# alojamiento directo...
	# DocumentRoot /var/www/miproyecto.helpcom.cl/public
	# ...o proxeado 
	ProxyPreserveHost On
	# etc...
</VirtualHost>

Nginx - sites-available/miproyecto.helpcom.cl.conf - pendiente

Certbot

Con Certbot, asumiendo que la configuración esté correcta, basta con invocar Certbot y el programa mismo ofrecerá la opción de modificar el archivo de VirtualHost correspondiente en vivo:

# Apache
certbot certonly --apache -d miproyecto.helpcom.cl
# Nginx
certbot certonly --nginx -d miproyecto.helpcom.cl

Si todo sale correctamente, Certbot generará una familia de certificados en /etc/letsencrypt/live.d para el dominio deseado, y generará un nuevo archivo de configuración para el servidor web con la configuración HTTPS, por ejemplo en este caso /etc/apache2/sites-available/miproyecto.helpcom.cl-le.conf. Antes de reiniciar el servicio web para que tome la configuración, es necesario activar este nuevo sitio con a2ensite.

acme.sh

Con acme.sh, asumiendo que la configuración está correcta, basta con invocar acme.sh pasándole específicamnte la ruta de certificados del servicio que queremos (si no se ha configurado el programa para eso) y habilitando el modo Stateless.

acme.sh --issue -d miproyecto.helpcom.cl --stateless

:!: Notar que la opción --stateless va al final.

Si todo sale correctamente, el sistema anunciará que se ha generado los archivos de certificado en el directorio deseado. Si no se configuró acme.sh para exportar los certificados al servicio web, se puede hacer directamente con la opción installcert:

# configurar como corresponda:
export CERTP=/etc/apache2/certacme
export CERTD=miproyecto.helpcom.cl
acme.sh --install-cert -d "CERTD" \
    --cert-file "${CERTP}/${CERTD}/cert.pem" \
    --key-file "${CERTP}/${CERTD/key.pem" \
    --fullchain-file "${CERTP}/${CERTD/fullchain.pem"

Una vez que los certificados estén copiados deben coincidir con las rutas en el archivo generado. Si no se configuró acme.sh para generar el archivo, o la configuración no corresponde, se puede crear manualmente con el ejemplo en VirtualHost-443.

Reiniciar httpd

Una vez que esté todo verificado, recargamos la configuración del servidor web:

# Apache
service apache2 reload
# Nginx
service nginx reload

HTTPS-only

Si se desea, una vez que el certificado está probado, forzar el sitio a usar HTTPS, se debe modificar la configuración del sitio de ese VirtualHost del puerto 80 para redirigir al puerto 443.

Para esto modificamos el fragmento del VirtualHost en el archivo de sitio HTTP (no HTTPS) por ejemplo sites-available/miproyecto.helpcom.cl.conf, como sigue:

Apache:

<VirtualHost *:80>
	ServerName miproyecto.helpcom.cl
	UseCanonicalName Off
	Redirect / https://miproyecto.helpcom.cl/
 
	# quitar DocumentRoot y directivas ProxyPass,
	# pero NO quitar otras directivas de configuración
...
 
</VirtualHost>

Nginx:

TBA

Caso 2: Subdominio proxeado por Helpcom

En este caso tenemos un proyecto que corre en HTTP que es alcanzable bajo uno de los subdominios wildcard de helpcom.cl que es proxeado por el servidor de Servicios: por ejemplo miproyecto.desarrollo.helpcom.cl (que es proxeado desde Servicios por la ruta ofis.helpcom.cl*.desarrollo.helpcom.clmiproyecto.desarrollo.helpcom.cl → servidor 235).

Requisitos:

(TBA)

VirtualHost-443

Acá se presenta un ejemplo de archivo de VirtualHost resultante, el cual puede ser usado como plantilla para configurar el acceso a los certificados manualmente si por alguna razón Certbot o acme.sh no pueden generar el archivo correctamente:

Ejemplo 1: Apache + Certbot

<VirtualHost *:443>
	ServerName miproyecto.helpcom.cl
	...
	Include /etc/letsencrypt/options-ssl-apache.conf
	SSLCertificateFile     /etc/letsencrypt/live/miproyecto.helpcom.cl/fullchain.pem
	SSLCertificateKeyFile  /etc/letsencrypt/live/miproyecto.helpcom.cl/privkey.pem
 
...
 
</VirtualHost>

Ejemplo 2: Nginx + acme.sh

server {
	listen 80;
	listen [::]:80;
	listen 443 ssl;
	listen [::]:443 ssl;
	server_name miproyecto.helpcom.cl;
 
	include include.d/acme.conf;
 
	ssl_certificate         /etc/nginx/certacme/miproyecto.helpcom.cl/fullchain.pem;
	ssl_certificate_key     /etc/nginx/certacme/miproyecto.helpcom.cl/key.pem;
	ssl_trusted_certificate /etc/nginx/certacme/miproyecto.helpcom.cl/fullchain.pem;
 
	ssl_stapling on
 
...
}