Let’s Encript!

Il mio script per l’aggiornamento automatico dei certificati.

#!/usr/bin/python
#
# checkcert 1.0 (python 2.7)
# (C) 2015 Giorgio L. Rutigliano, www.iltecnico.info, www.i8zse.eu
# licenza GNU-GPL
#
import subprocess
import datetime
import os
import smtplib


def expdays(cert):
   #
   # recupera la data di scadenza, la converte in formato iso e calcola il numero di giorni rimanenti
   # restituisce il numero di giorni mancanti alla scadenza
   # cert -> filename certificato
   #
   cmd='date --date="$(openssl x509 -in '+cert+' -noout -enddate | cut -d= -f 2)" --iso-8601'
   p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
   out,err=p.communicate()
   p.wait()
   exp=[int(i) for i in out.split('-')]
   d1=datetime.datetime.now()
   d2=datetime.datetime(*exp)
   return (d2-d1).days

def renewcert(w,d,e):
   #
   # richiede l'aggiornamento del certiticato
   # w -> path root website
   # d -> lista domini del certificato
   # e -> email
   # restituisce stdout del comando
   #
   cmd='/usr/share/letsencrypt/letsencrypt-auto certonly --webroot -w '
   cmd+=w
   for i in d:
      cmd+=' -d '+i
   cmd+=' --renew-by-default --email '+e
   p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
   out,err=p.communicate()
   p.wait()
   return cmd+'\n'+out

def restart(serv):
   #
   # riavvia un servizio
   # serv -> nome del servizio
   # restituisce stdout del comando
   #
   cmd='service '+serv+' restart'
   p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
   out,err=p.communicate()
   p.wait()
   return cmd+'\n'+out

def mailto(fema,dema,subj,msg):
   #
   # invia una email
   # fema -> from
   # dema -> to
   # subj -> subject
   # msg  -> body
   #
   bod = "From: Check Certificati srv6 <'+fema+'>\n"
   bod+= "To: Sysadmin <'+dema+'>\n"
   bod+= "Subject: '+subj+'\n\n"+msg
   s = smtplib.SMTP('smtp.email.loc')
   s.sendmail(fema, [dema], bod)
   s.quit()


f=open('checkcert.lst','r')
log=open('checkcert.log','w')
certs=f.readlines()
f.close()
errori=""
rinnovi=""
ema='sysadmin@dommain.loc'

for dom in certs:
   xx=dom.strip().split('|')
   wd=xx[0]
   dom=xx[1].split(';')
   certfile='/etc/letsencrypt/live/'+dom[0]+'/cert.pem'
   days=0
   if os.path.isfile(certfile):
      days=expdays(certfile)
   log.write('dominio '+dom[0]+' scade in '+str(days)+' giorni\n')
   if days<15:
      log.write('rinnovo dominio '+dom[0]+'\n')
      out=renewcert(wd,dom,ema,log)
      log.write(out+'\n')
      if os.path.isfile(certfile):
         days=expdays(certfile)
         if days<15:
            log.write('errore aggiornamento dominio '+dom[0]+'\n')
            errori+="Dominio "+dom[0]+", scade in "+str(days)+" giorni\n"
         else:
            rinnovi+="Dominio "+dom[0]+'\n'

if (errori<>''):
   mailto(ema,ema,'Errore aggiornamento certificati',errori)

if (rinnovi<>''):
   mailto(ema,ema,'Certificati rinnovati',rinnovi)
   log.write(restart('apache2'))

log.close()

Il file di configurazione ha questo formato:

/var/www/dom1|dom1.loc;www.dom1.loc
/var/www/dom2|dom2.loc;www.dom2.loc

Path della root del dominio, seguita dal nome e da eventuali alias.

Lo script è lanciato da cron.daily ed utilizza come autenticatore webroot, mentre apache ` configurato manualmente. Lo script verifica la scadenza del certificato, se ` inferiore a 15 giorni lo rinnova. Se un rinnovo non va a buon fine invia una email di alert.

Lo stesso script può essere utilizzato anche per i server di posta elettronica, che possono essere configurati in questa maniera:

/etc/postfix/main.cf

smtpd_tls_cert_file=/etc/letsencrypt/live/<dominio>/fullchain.pem
smtpd_tls_key_file= /etc/letsencrypt/live/<dominio>/privkey.pem
smtpd_use_tls=yes

/etc/dovecot/conf.d/10-ssl.conf

ssl_cert = </etc/letsencrypt/live/<dominio>/fullchain.pem
ssl_key = </etc/letsencrypt/live/<dominio>/privkey.pem
ssl_ca = </etc/letsencrypt/live/<dominio>/chain.pem
ssl_verify_client_cert = yes

Il restart dei servizi interessati (apache per il webserver, dovecot e postfix nel caso di server di posta) è in stile init, i miei server sono systemd-free 😉

Pubblicato in Linux, Sicurezza Taggato con: ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*