Auto-renovación de certificado de SoftEther VPN con Let's Encrypt

Auto-renovación de certificado de SoftEther VPN con Let's Encrypt

La semana pasada comentaba paso a paso como poner a punto SoftEther VPN un servidor VPN Point to Site en Azure que fuera compatible con ExpressRoute y que además nos permitiera autenticar a los usuarios a través de Active Directory.

Uno de los protocolos más populares en el mundo Microsoft para establecer los túneles es el SSTP, que opera a través del puerto TCP/443 a través de un canal TLS; muy parecido al HTTPS, por lo que es bastante amistoso con contarfuegos y redes restringidas. Como utilizamos un canal TLS, se utiliza el mismo sistema de confianza al que estamos acostumbrados con el HTTPS: el servidor se identifica con un certificado en cuya entidad emisora deberemos confiar o de lo contrario la conexión no se considerará segura.

Si estamos desplegando el servicio en un laboratorio, entorno doméstico o pequeña oficina; quizá no queramos invertir anualmente en una entidad certificadora (VeriSign, Digicert, Thawte, Symantec, etc...) que nos lo emita, con lo que tenemos dos alternativas:

  • Montar nuestra propia PKI y asegurarnos de que el certificado raíz está distribuido e instalado en todos los dispositivos.
  • Utilizar Let's Encrypt.

Supongamos el último.

Configurar SoftEther VPN automáticamente con Let's Encrypt

Como he comentado en alguna ocasión, los certificados emitidos por Let's Encrypt sólo tienen validez durante 3 meses. Aunque nos pueda chocar en un principio, esta incomodidad fomenta una muy buena práctica: tener totalmente automatizado el ciclo de renovación de certificados TLS de nuestra infraestructura. De lo contrario, cada 3 meses nos enfrentaremos al problema de caducidad.

En este artículo no voy a entrar en cómo se configura y obtienen certificados con Let's Encrypt, pero asumiré que se está haciendo con Certbot, la forma más sencilla y potente de hacerlo -que de momento sólo está disponible en entornos tipo UNIX-

Una vez instalamos Certbot en nuestra máquina UNIX y hemos generado unos certificados, se nos crea una nueva entrada en el CRON para gestionar la renovación automática. En el caso de GNU/Linux en /etc/cron.daily/letsencrypt, que tiene el siguiente aspecto:

#!/bin/sh
certbot renew --quiet

Sencillamente estamos diciendo que vamos a ejecutar la operación de renovación de forma diaria (antes de pedir nuevos certificados comprueba si realmente es necesario porque estén próximos a expirar).

¿Y si aprovechamos este archivo para instruir a SoftEther VPN que importe el nuevo certificado? Para ello nos valemos de la utilidad de administración de línea de comandos: vpncmd.

El comando en cuestión para actualizar el certificado de SoftEther VPN de forma no interactiva es:

/usr/local/vpnserver/vpncmd /server localhost /adminhub:AZURE /PASSWORD:passworddeadministrador /CMD ServerCertSet /LOADKEY:/etc/letsencrypt/live/vpn.calnus.com/privkey.pem /LOADCERT:/etc/letsencrypt/live/vpn.calnus.com/cert.pem

Vamos paso a paso por cada parámetro:

  • server. El servidor SoftEther VPN donde vamos a realizar la actualización. Efectivamente, podemos usar una única máquina para actualizar remotamente todos los servidores si fuera necesario.
  • adminhub. El HUB en el que operaremos por defecto. He puesto AZURE, pero será el que tengáis en vuestra configuración.
  • PASSWORD. La contraseña del administrador del HUB. Evidentemente es muy mala idea dejar contraseñas escritas en claro en cualquier script, así que aunque para una primera prueba nos puede servir, recomiendo mirar alguna alternativa para no recurrir a ello. Este hilo de StackExchange, Jenny D da una respuesta magistral a este tema. En el futuro dedicaré un artículo a ello.
  • CMD. El comando de la utilidad de administración que vamos a ejecutar, en este caso ServerCertSet.
  • LOADKEY. El certificado que contiene la clave privada.
  • LOADCERT. El certificado con sólo la clave pública.

Nuestro archivo /etc/cron.daily/letsencrypt tendrá un aspecto similar a:

#!/bin/sh
certbot renew --quiet
/usr/local/vpnserver/vpncmd /server localhost /adminhub:AZURE /PASSWORD:passworddeadministrador /CMD ServerCertSet /LOADKEY:/etc/letsencrypt/live/vpn.calnus.com/privkey.pem /LOADCERT:/etc/letsencrypt/live/vpn.calnus.com/cert.pem

Permitidme que insista: es muy mala idea dejar una contraseña escrita en un script. Revisar en detalle este hilo de StackExchange.

Happy Let's Encrypt & SoftEther VPN!

Related Article