Let’s Encrypt y sus problemas con la Redirección Permanente a HTTPS

Llevo tiempo buscando una solución a este problema… he probado varias soluciones que he leído en la comunidad de Let’s Encrypt, pero nunca he conseguido que funcionaran como a mí me gustaría…

Entonces, cansado de repetir esta operación “Desactivar la Redirección Permanente a HTTPS cada tres meses en este último año, para editar los archivos de configuración de cada domino/subdominio, me propuse hacer un Script en Python para automatizar esta tarea.

Este Script tiene tres modos de trabajo

  • Modo interactivo: Ejecutando el Script con el argumento –w editara los archivos de configuración de los dominios que estén incluidos en el Array de dominios y luego reiniciara el Apache2. Llegado a este punto, el Script esta pausado hasta que pulses una tecla para revertir los cambios en los archivos de configuración, entonces en ese tiempo tu podrás solicitar los certificados Let’s Encrypt
  • Desactivar la Redirección Permanente a HTTPS: Ejecutando el Script con el argumento –d
  • Activar la Redirección Permanente a HTTPS: Ejecutando el Script con el argumento –e

Estas dos últimas opciones de funcionamiento del Script, está pensadas para añadir dos tareas al Cron del Sistema y así, hacer la renovación de los certificados automáticamente sin intervención humana 🙂

Para eso, tu tendrás que crear dos tareas en el plazo de tiempo le has marcado a la renovación de los certificados Let’s Encrypt. En mi caso, son cada 3 meses: “Plazo máximo”

  1. La primera tarea se ejecuta cada tres meses, a las 23:50 para que Desactive la Redirección Permanente a HTTPS.
  2. La segunda tarea se ejecuta cada tres meses, a las 00:10 para que Active la Redirección Permanente a HTTPS.

El único inconveniente que tiene esto, es que durante 20 minutos, nuestros dominios no estarán redireccionados hacia HTTPS. Se podría reducir el tiempo, pero por seguridad prefiero tener un margen amplio, ya que no me parece crítico por la hora que se va a ejecutar «00:00» la renovación de los certificados.

Aquí os dejo el código completo de auto_ssl.py

#!/usr/bin/python
import os 
import sys

directorio_configuracion = '/etc/apache2/sites-available/'
array_dominios = ['valero-torres.es.conf',
		  'admin.valero-torres.es.conf',		   
		  'webmail.valero-torres.es.conf']

def func_apache_2 (argumento):	
	print ('\n\nArrancando/Parando/Reiniciando Apache2')
	if os.path.isfile('/etc/init.d/apache2'):	
		print ('/etc/init.d/apache2 ' + argumento)
		retorno_apache2 = os.system('/etc/init.d/apache2 ' + argumento)
	else:
		print ('Error... no he podido reiniciar el servicio Apache2 (DEBIAN) \n   /etc/init.d/apache2 ' + argumento + '\n')
	return;

				  
def func_renombrar_01 (fichero):	
	fichero = directorio_configuracion + fichero
	
	if os.path.isfile(fichero):		
		print ('Editando configuracion de --> ' + fichero)
		editar_fichero = open (fichero).read()
		
		editar_fichero = editar_fichero.replace('RedirectPermanent', '#RedirectPermanent')	
		
		escribir_fichero = open(fichero, 'w')
		escribir_fichero.write(editar_fichero)
		escribir_fichero.close()	

	else:	
		print ('Tarea no realizada' + fichero)
	
	return;
   
   
def func_renombrar_02 (fichero):	
	fichero = directorio_configuracion + fichero
	
	if os.path.isfile(fichero):		
		print ('Restaurando configuracion de --> ' + fichero)
		editar_fichero = open (fichero).read()
		
		editar_fichero = editar_fichero.replace('#RedirectPermanent', 'RedirectPermanent')	
		
		escribir_fichero = open(fichero, 'w')
		escribir_fichero.write(editar_fichero)
		escribir_fichero.close()	

	else:	
		print ('Tarea no realizada' + fichero)
	
	return;
   
  
# Seleccion del Argumento
if len(sys.argv) > 1:
    argumento = sys.argv[1]
else:
    argumento = '-h'
  
  
if argumento == '-h': # Ayuda
	print ('\n\nBienvenido al Script de automatizacion de Lets Encrypt de BeniValero')
	print ('---------------------------------------------------------------------\n')
	print ('Argumentos disponibles:\n')
	print ('    -w --> Modo interactivo: Editara los archivos de configuracion de los dominios que esten incluidos en el Array de dominios y luego reiniciara el Apache2. Llegado a este punto, el Script esta pausado hasta que pulses una tecla para revertir los cambios en los archivos de configuracion, entonces en ese tiempo tu podras solicitar los certificados Lets Encrypt. \n')
	print ('    -d --> Desactivar la Redireccion Permanente a HTTPS. \n')	
	print ('    -e --> Activar la Redireccion Permanente a HTTPS. \n\n'	)
	print ('     ********************************************************************')
	print ('     * Importante, es necesario que edite este Script a sus necesidades *')
	print ('     ********************************************************************\n\n')
 
 
if argumento == '-w':  # Modo manual 
	 # Editando ficheros de configuracion
	for dominio in array_dominios:
		func_renombrar_01(dominio)

	# Reiniciar Apache
	func_apache_2('restart')

	# Solicitar Certificador Let's Encrypt
	print ('\nAhora puedes solicitar el o los certificados Lets Encrypt')
	raw_input('Pulsa una tecla para continuar... \n\n')

	# Restaurando fichero de configuracion
	for dominio in array_dominios:
		func_renombrar_02(dominio)

	# Reiniciar Apache
	func_apache_2('restart')	
	
	
if argumento == '-d':  # Configurar Cron Jobs para desactivar la redireccion permanente (DISABLED)
	 # Editando ficheros de configuracion
	for dominio in array_dominios:
		func_renombrar_01(dominio)

	# Reiniciar Apache
	func_apache_2('restart')
	
	# Solicitar Certificador Let's Encrypt
	print ('\nAhora puedes solicitar el o los certificados Lets Encrypt')
	
	
if argumento == '-e':  # Configurar Cron Jobs para activar la redireccion permanente (ENABLE)
	# Restaurando fichero de configuracion
	for dominio in array_dominios:
		func_renombrar_02(dominio)
		
	# Reiniciar Apache
	func_apache_2('restart')

Recordar de editar el Array “array_dominios” y especificar los dominios que queréis aplicar el Script.

array_dominios = ['valero-torres.es.conf',
		  'admin.valero-torres.es.conf',		   
		  'webmail.valero-torres.es.conf']

Aquí podéis descargar el script.

Comparte en las Redes Sociales