Certificato DST Root CA X3 di Let's Encrypt scaduto: risolvere curl error 60 e wget returned 5

Let's Encrypt è un organizzazione senza scopo di lucro che emette certificati digitali SSL.

Dalla sua nascita Let's Encrypt ha sempre generato un certificato gratuito utilizzando un "certificato radice" (root certificate) chiamato "DST Root CA X3", ma da Maggio 2021 ha iniziato ad utilizzare il più nuovo e moderno certificato radice "ISRG Root X1" ed ha emesso i certificati utilizzando entrambi i certificati radici in modo da mantenere la compatibilità con i dispositivi meno moderni.

In data 30 settembre 2021 alle ore 16:01:15, il vecchio certificato radice DST Root CA X3 è definitivamente scaduto e molti dispositivi con una vecchia libreria OpenSSL hanno iniziato ad avere problemi nel connettersi a server che utilizzano i certificati HTTPS rilasciati da Let's Encrypt.

Nello specifico, ad avere problemi sono i dispositivi che utilizzano una versione di OpenSSL 1.0.2 a causa di un bug che impedisce la corretta gestione dei certificati con firma incrociata nel caso uno dei certificati radice coinvolti nella firma scade, anche se esistono altre catene di certificazione valide.

Quindi per continuare a collegarsi senza problemi a server che utilizzano un certificato HTTPS rilasciato da Let's Encrypt occorre che i clients utilizzino una libreria aggiornata o direttamente la libreria OpenSSL 1.1.1, nella maggior parte dei casi questo non è un problema poiché basta aggiornare il software ma in caso di dispositivi embedded o non supportati dal produttore diventa un problema più serio.

Questo evento ha toccato direttamente il repository repository.macoers.com che utilizza un certificato SSL rilasciato da Let's Encrypt ed ospita progetti utilizzati da macchine Linux e da alcuni dispositivi Technicolor, come ad esempio Voipblock ed i feeds di pacchetti OpenWrt per Homeware 18 ed Homeware 19.

Tentando di accedere al repository con curl da una macchina Debian con libreria OpenSSL non aggiornata si ottiene questo errore:

~# curl https://repository.macoers.com
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

In questo caso caso il problema è di semplice soluzione, basta infatti installare le libreria aggiornate:

~# apt-get update && apt-get install libssl1.1 libssl1.0.2

In questo modo si installa la recente libreria per curl versione 1.0.2u-1~deb9u6 nel quale il problema che affligge OpenSSL 1.0.2 è stato risolto.

Tentando di accedere al repository con wget da una macchina Debian con libreria OpenSSL non aggiornata si ottiene questo errore:

~# wget https://repository.macoers.com
Risoluzione di repository.macoers.com (repository.macoers.com)...
Connessione a repository.macoers.com (repository.macoers.com)|:443... connesso.
ERRORE: il certificato di "repository.macoers.com" non è fidato.
ERRORE: Il certificato di "repository.macoers.com" è scaduto.

Anche in questo caso caso il problema è di semplice soluzione, basta infatti installare le librerie aggiornate:

~# apt-get update && apt-get install libssl1.1 libgnutls-openssl27

Tentando di accedere al repository con curl da un DGA4130/DGA4131/DGA4132 con Homeware 18 ed Homeware 19 si ottiene questo errore:

~# curl https://repository.macoers.com
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

In questo caso il problema è ben più complesso poiché normalmente curl per OpenWrt di default non utilizza la libreria OpenSSL ma utilizza mbedTLS, questo significa che non è possibile risolvere il problema in maniera semplice e veloce, infatti nella giornata di ieri sono stati aperti molti thread sul forum di OpenWrt perché lo stesso problema affligge anche molti dispositivi che utilizzano OpenWrt "standard" impedendo addirittura loro di connettersi al repository ufficiale downloads.openwrt.org anch'esso con certificato SSL rilasciato da Let's Encrypt(1 - 2 - 3).

Il SysAdmin di OpenWrt ha reso nuovamente raggiungibile il repository dai dispositivi applicando temporaneamente il Workaround lato server suggerito da OpenSSL.

Avrei potuto applicare anche io lo stesso Workaround, ma ho invece deciso di risolvere il problema alla radice ed ho quindi trascorso gli ultimi giorni alla ricerca della migliore soluzione da adottare sia per Homeware 18 che per Homeware 19.

Sui dispositivi Technicolor con Homeware curl è stato compilato per utilizzare la libreria OpenSSL di sistema, questo il curl di un Homeware 18:

# curl -V
curl 7.60.0 (arm-openwrt-linux-gnu) libcurl/7.60.0 OpenSSL/1.0.2o
Release-Date: 2018-05-16
Protocols: ftp ftps http https 
Features: AsynchDNS IPv6 Largefile SSL HTTPS-proxy

Homeware 18 utilizza un vecchissimo curl 7.60.0-1 con supporto SSL grazie ad una vecchia libopenssl 1.0.2o-1. In un primo momento ho cercato quindi di utilizzare la soluzione più elegante, ossia compilare la nuova libreria OpenSSL 1.1.1 (libopenssl_1.1.1d-1, libopenssl-conf_1.1.1d-1, openssl-util_1.1.1d-1) e ricompilare curl in modo da fargliela utilizzare. Tutto ha funzionato alla perfezione fin quando non mi sono accorto che molti dei binari presenti in homeware 18 (dlnad, cwmpd, fhcd ed nginx) continuavano a cercare le vecchie librerie condivise (libssl.so.1.0.0 e libcrypto.so.1.0.0) e alcuni non avrei potuti ricompilarli col supporto alla nuova libreria poiché codice proprietario di Technicolor. Ho dovuto quindi ripiegare su una soluzione completamente differente, utilizzare una versione di curl che per l'SSL utilizza una libreria mbedTLS aggiornata.

Su Homeware 18 quindi la soluzione è semplice ed immediata, basta collegarsi al router tramite ssh ed aggiornare curl con la versione presente nei feeds:

opkg update && opkg install curl libcurl

Homeware 19 utilizza un vecchio curl 7.66.0-1 con supporto SSL grazie ad una vecchia libopenssl 1.0.2u-1. Alla luce di quanto imparato da homeware 18 avrei voluto applicare la stessa soluzione anche per homeware 19 ma non ho potuto farlo poiché in questo caso a causa della scadenza del certificato radice di Let's Encrypt oltre a curl smette di funzionare anche il gestore dei pacchetti che ad un opkg update restituisce wget returned 5:

# opkg update
Downloading https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/base/Packages.gz
*** Failed to download the package list from https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/base/Packages.gz

Downloading https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/packages/Packages.gz
*** Failed to download the package list https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/packages/Packages.gz

Downloading https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/luci/Packages.gz
*** Failed to download the package list from https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/luci/Packages.gz

Downloading download https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/routing/Packages.gz
*** Failed to download the package list from download https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/routing/Packages.gz

Downloading https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/telephony/Packages.gz
*** Failed to download the package list from https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/telephony/Packages.gz

Downloading https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/target/packages/Packages.gz
*** Failed to download the package list from https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/target/packages/Packages.gz

Collected errors:
 * opkg_download: Failed to download https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/base/Packages.gz, wget returned 5.
 * opkg_download: Failed to download https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/packages/Packages.gz, wget returned 5.
 * opkg_download: Failed to download https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/luci/Packages.gz, wget returned 5.
 * opkg_download: Failed to download https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/routing/Packages.gz, wget returned 5.
 * opkg_download: Failed to download https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/telephony/Packages.gz, wget returned 5.
 * opkg_download: Failed to download https://repository.macoers.com/homeware/18/brcm63xx-tch/VANTW/target/packages/Packages.gz, wget returned 5. 

Questa differenza perché Homeware 18 per il gestore dei pacchetti utilizza wget (dalla busybox) che non è stato colpito dal scadenza del certificato radice di Let'Encrypt, mentre Homeware 19 utilizza uclient-fetch (un wget più piccolo e leggero) che per l'ssl si appoggia alla libreria OpenSSL di sistema. In questo caso non è stato quindi sufficiente compilare curl con una libreria mbedTLS aggiornata.

Su Homeware 19 ho quindi dovuto ricorrere ad una soluzione differente ed un poco più laboriosa, ho dovuto compilare una versione di OpenSSL aggiornata (1.1_1.1.1k-1) da far utilizzare al gestore dei pacchetti e da installare in parallelo alla vecchia versione di OpenSSL di sistema in modo da non rompere le dipendenze dei binari Technicolor ed ho compilato una versione di curl che utilizza la libreria OpenSSL aggiornata. Per installare il tutto basta collegarsi al router tramite ssh e installare dai feeds i seguenti pacchetti:

curl -k https://repository.macoers.com/homeware/19/brcm6xxx-tch/VANTW/base/libopenssl1.1_1.1.1k-1_arm_cortex-a9_neon.ipk --output /tmp/libopenssl1.1_1.1.1k-1_arm_cortex-a9_neon.ipk
curl -k https://repository.macoers.com/homeware/19/brcm6xxx-tch/VANTW/base/libopenssl-conf_1.1.1k-1_arm_cortex-a9_neon.ipk --output /tmp/libopenssl-conf_1.1.1k-1_arm_cortex-a9_neon.ipk
curl -k https://repository.macoers.com/homeware/19/brcm6xxx-tch/VANTW/base/openssl-util_1.1.1k-1_arm_cortex-a9_neon.ipk --output /tmp/openssl-util_1.1.1k-1_arm_cortex-a9_neon.ipk
curl -k https://repository.macoers.com/homeware/19/brcm6xxx-tch/VANTW/base/libustream-openssl20150806_2020-03-13-40b563b1-1_arm_cortex-a9_neon.ipk --output /tmp/libustream-openssl20150806_2020-03-13-40b563b1-1_arm_cortex-a9_neon.ipk
curl -k https://repository.macoers.com/homeware/19/brcm6xxx-tch/VANTW/base/curl_7.66.0-3_arm_cortex-a9_neon.ipk --output /tmp/curl_7.66.0-3_arm_cortex-a9_neon.ipk
curl -k https://repository.macoers.com/homeware/19/brcm6xxx-tch/VANTW/base/libcurl4_7.66.0-3_arm_cortex-a9_neon.ipk --output /tmp/libcurl4_7.66.0-3_arm_cortex-a9_neon.ipk
opkg install --nodeps /tmp/*.ipk

Sui dispositivi Technicolor senza questo aggiornamento di curl/openssl Voipblock non scarica giornalmente la nuova blacklist online e non è in grado di utilizzare lo scraper online, è però possibile aggiornare Voipblock alla nuova versione appena pubblicata per continuare ad utilizzarlo regolarmente anche con il vecchio curl e la vecchia libreria openssl.

Chi utilizza Voipblock per Asterisk può eseguire questo comando tramite ssh:

curl -ks https://repository.macoers.com/voipblock/voipblock.sh | ash -s update_for_asterisk

Chi utilizza Voipblock per mmpbx può eseguire questo comando tramite ssh:

curl -ks https://repository.macoers.com/voipblock/voipblock.sh | ash -s tch_update_for_mmpbx

La versione di Voipblock per mmpbx è stata parzialmente riscritta quindi è consigliato prendere visione della nuova documentazione.

Intanto voglio ringraziare tutti gli utenti che negli ultimi giorni hanno iniziato a segnalare i numeri per la blacklist telefonica condivisa di Voipblock.

Aggiungi un commento

Commenti

Ho appena concluso l'inserimento dei tuoi seed, seguendo queste istruzioni per ovviare all'errore con wget (homeware 19), ma l'installazione non risolve il problema. In primis curl utilizzato nella versione 2.3.5 del firmware è la 7.69, quindi per installare il tuo compilato ho dovuto forzare il downgrade; comunque il problema non viene risolto.
Ti ringrazio per il lavoro che stai svolgendo.
Saluti.

Ciao Ivan, come puoi vedere questo articolo è del Dicembre 2021 e da allora homeware 19 è stato aggiornato diverse volte, quindi la versione di curl installata nel firmware e più aggiornata di quella presente nel repository.

Personalmente utilizzo sui miei vecchi DGA homeware 18, non ho mai utilizzato homeware 19 quindi tutto ciò che lo riguarda è in test ma questa procedura è stata provata con successo dalla community e stando a quanto ricordo il downgrade è sufficiente per continuare ad utilizzare questi feeds. Accertati di effettuare il downgrade sia di curl che di libcurl.

Al momento per mancanza di tempo e di interesse ho messo in pausa la compilazione dei feeds per homeware 19 ma non escludo di riprendere a giocarci quando sarò più libero e mi procurerò un dga4331.

Risolto!
Mi sono accorto che quando facevo l’installazione opkg trovata già un file di configurazione di openssl e non lo sovrascriveva.
Sovrascrivendo il file tutto è andato a posto.
Grazie del gran lavoro che stai svolgendo!
Qualora avessi necessità di aiuto con l’SDK (anche per l’automatozzazione della compilazione) o volesse fare delle prove con un DGA4331 (a breve farò il root anche di questo), sono a disposizione.
Buona serata.

Ivan