# Let's Encrypt

Let's Encrypt è una certification authority che automatizza gratuitamente la creazione, la validazione, il rilascio ed il rinnovo di certificati X.509 per il protocollo TLS.
Il client di Let's Encrypt è software libero. La lista dei certificati rilasciati è pubblica.

## Scopo

Lo scopo principale del progetto è quello di riuscire a cifrare tutte le comunicazioni sul World Wide Web. Let's Encrypt si prefigge di raggiungere questo scopo azzerando il costo dei certificati ed andando ad automatizzare il processo di configurazione del web server, della verifica tramite email e del rinnovo del certificato. In questo modo la complessità di gestione e manutenzione di una cifratura TLS si riduce drasticamente (su un web server su un sistema unix-like sono sufficienti pochi secondi per configurare il supporto ad HTTPS).
Il client di Let's Encrypt è incluso nei repository ufficiali di Debian, al fine di favorire maggiormente la diffusione del client. La maggior parte dei browser fa affidamento su Let's Encrypt per deprecare l'utilizzo di connessioni HTTP non cifrate.
Let's Encrypt rilascia solamente certificati di tipo Domain Validated, non è previsto il rilascio di certificati di tipo Organization Validation o Extended Validation. Dal 13 marzo 2018 sono supportati ufficialmente anche i certificati wildcard usati per mettere in sicurezza, con lo stesso certificato di dominio, anche i sottodomini.

## Storia

Il progetto Let's Encrypt nasce nel 2012 da parte di due impiegati di Mozilla, Josh Aas e Eric Rescorla insieme a Peter Eckersley della Electronic Frontier Foundation e J. Alex Halderman della Università del Michigan. L'Internet Security Research Group, l'ente che attualmente sta seguendo lo sviluppo di Let's Encrypt è entrata nel progetto nel maggio 2013.
Il 18 novembre 2014, Let's Encrypt viene annunciato ufficialmente al pubblico.
Il 28 gennaio 2015, il protocollo ACME viene presentato all'IETF per essere ufficialmente standardizzato. Il 9 aprile 2015 lo ISRG e la Linux Foundation annunciano ufficialmente la loro collaborazione. All'inizio del giugno 2015 vengono generati il certificato root ed il certificato intermedio di Let's Encrypt, mentre il 16 giugno vengono annunciate ufficialmente le scadenze che indicano la settimana del 27 luglio come obiettivo per il rilascio del primo certificato e la settimana del 14 settembre 2015 come papabile per il rilascio pubblico del servizio. Il 7 agosto 2015 queste scadenze vengono riviste per permettere di fornire maggiore stabilità e sicurezza al sistema, facendo slittare alla settimana del 7 settembre 2015 il rilascio del primo certificato e alla settimana del 16 novembre il rilascio pubblico del servizio.
Il 14 settembre 2015, Let's Encrypt rilascia il suo primo certificato, per il dominio helloworld.letsencrypt.org. Nello stesso giorno la ISRG invia la richiesta a Mozilla, Microsoft, Google ed Apple per i loro root program, al fine di rendere i certificati di Let's Encrypt riconosciuti dai principali browser.
Il 19 ottobre 2015, il certificato intermedio di Let's Encrypt diventa 'cross-signed' grazie al supporto di IdenTrust. In questo modo tutti i certificati finora rilasciati da Let's Encrypt risultano riconosciuti dai principali browser.
Il 12 novembre 2015, Let's Encrypt annuncia che il rilascio per il grande pubblico sarebbe slittato e che avrebbe avviato il programma di beta pubblica il 3 di dicembre dello stesso anno.
Il 3 dicembre 2015, Let's Encrypt annuncia ufficialmente di essere entrato nella fase di beta pubblica
Dal 12 aprile 2016 Let's Encrypt esce dalla beta pubblica, dichiarando di aver validato 1,7 milioni di certificati per 3,8 milioni di siti web.

## Tecnologie

Nel giugno 2015, Let's Encrypt ha generato un certificato root RSA che si trovava su un hardware security module (HSM) poi messo offline. Il certificato root è stato utilizzato per firmare due certificati intermedi, i quali sono a loro volta cross-signed da parte di IdenTrust. Uno dei certificati intermedi viene utilizzato per la firma dei certificati rilasciati, mentre l'altro viene mantenuto offline a scopo di backup nel caso ci fossero problemi con il primo certificato.
Il cross-signing da parte di IdenTrust consente alla maggior parte dei browser di considerare i certificati come attendibili, anche nel caso in cui il certificato root di Let's Encrypt non venga riconosciuto dal browser.
Gli sviluppatori di Let's Encrypt prevedono di generare anche un certificato root ECDSA entro la prima parte del 2016.

### Protocollo

Il protocollo utilizzato da Let's Encrypt per l'autenticazione e il rilascio dei certificati si chiama Automated Certificate Management Environment (ACME), è un protocollo del tipo challenge-response. Il server (Let's Encrypt) presenta al client (il web server) un insieme di challenge che il proprietario del dominio deve risolvere per provare di essere il responsabile del dominio.
Nella versione beta di Let's Encrypt è supportata solamente la challenge di tipo HTTP: si richiede al gestore del web server di restituire un token a fronte di una richiesta GET eseguita sul web server.
Il protocollo ACME prevede anche altri tipi di challenge, in particolare Let's Encrypt prevede di supportare le challenge di tipo DNS: si richiede di inserire un record di tipo TXT contenente un token presso il server DNS del dominio per cui si richiede il certificato.
Tutte le richieste effettuate tramite il protocollo ACME avvengono attraverso JSON firmati (anche detti JSON web signature, JWS) scambiati su connessioni HTTPS. La versione draft delle specifiche del protocollo può essere trovata su GitHub. Una versione del protocollo ACME è stata inoltre inviata all'IETF per la sua standardizzazione.

### Implementazioni software

La certification authority consiste in un software chiamato Boulder e scritto in Go, che implementa il protocollo lato server. Boulder viene rilasciato come software libero sotto licenza Mozilla Public License (MPL), di fatto offre delle API RESTful che possono essere invocate tramite canale cifrato con TLS.
Il software che esegue sul lato client (sul web server) si chiama certbot, è scritto in Python ed è rilasciato con licenza Apache. Il software client si occupa della gestione dei certificati, del processo di validazione del dominio, dell'installazione dei certificati, della configurazione HTTPS sul web server e del rinnovo dei certificati. Il client permette di configurare in automatico i web server Apache ed nginx.

## Soggetti coinvolti

Let's Encrypt è un servizio offerto dal Internet Security Research Group (ISRG), un'organizzazione senza scopo di lucro con il focus principale sulla sicurezza su internet. Gli sponsor principali del progetto sono la Electronic Frontier Foundation (EFF), la Mozilla Foundation, Akamai, Cisco, Chrome ed OVH. Fra gli altri partner vi sono anche la certification authority IdenTrust, la Università del Michigan, la Stanford School of Law, la Linux Foundation e Facebook.

### Technical Advisory Board

* Rich Salz (Akamai)
* Joe Hildebrand (Cisco)
* Jacob Hoffman-Andrews (Electronic Frontier Foundation)
* J.C. Jones (Mozilla Foundation)
* Russ Housley (Indipendente)
* Ryan Hurst (Indipendente)
* Stephen Kent (Indipendente)
* Karen O'Donoghue (Internet Society)