Aggiornare WebServer CentOS 7a TLS 1.2 – 1.3

Ciao eccomi nuovamente qui.

La maggior dei sistemisti gestisce ambienti ibridi, e sicuramente avranno anche qualche webserver con qualche sito o applicazione web che gira ancora su Linux CentOS 7.

In questi giorni mi sono pervenute richieste su alcuni siti non più visibili dagli utenti. Inizialmente pensavo a qualche malfunzionamentoo sui server, ma poi mi sono ricordato che i browser più usati, come Firefox, Chrome ed Edge sono stati aggiornati ad usare i protocolli di sicurezza TLS1.2 e TLS1.3; infatti provando ad accedere ai siti in questione con un browser meno recente, le pagine apparivano regolarmente.

Da qui la domanda su come risolvere il problema, senza dover migrare tutto, per ora verso altre distro.

Studiando il probelma e facendo alcune ricerche in rete ho trovato la soluzione che condivido di seguito.

I web server trattati sono APACHE e NGINX. La procedura è pressochè identica tranne in piccole cose per NGINX, ma iniziamo con il tutorial e ricordate sempre di eseguire un backup della macchina prima di procedere.

Se ssu i nostri server abbiamo installato APACHE O NGINX, noteremo che OpenSSL è alla versione 1.0.2k-fips, basta digitare da linea di comando openssl version. Ma se volete abilitare TLS 1.3 vanno soddisfatti alcuni requisiti.

Requisiti richiesti

  • Apache versione 2.4.37 o successiva.
  • Nginx versione 1.13.0 o successiva.
  • OpenSSL versione 1.1.1 o successiva.
  • Un nome di dominio valido con record DNS configurati correttamente.
  • Un certificato TLS valido.

Poiché stiamo pianificando di distribuire TLS1.3 sul nostro server CentOS7 di produzione, disponiamo già di un nome di dominio valido, di un certificato TLS valido e di una versione Nginx 1.16.1 che è successiva alla versione minima richiesta per TLS 1.3 o Apache 2.4.37. Ma le attuali versioni di Nginx e Apache sono costituite con OpenSSL 1.0.2k-fips quindi, prima dobbiamo aggiornare OpenSSL alla versione 1.1.1 attraverso il processo di compilazione e ricompilare e poi nuovamente il nostro Nginx o Apache con una nuova versione di OpenSSL.

Come possiamo vedere di seguito, la versione OpenSSL è OpenSSL 1.0.2k-fps 26 gennaio 2017 e Nginx versione 1.16.1, diamo il seguente comando.

Per NGINX diamo nginx -v e per Apache diamo httpd -v.

Verificata la versione installiamo i pacchetti richiesti per permettere di installare Openssl-1.1.1, diamo questo comando tramite shell.

yum install gcc gcc-c++ pcre-devel zlib-devel make unzip gd-devel perl-ExtUtils-Embed libxslt-devel openssl-devel perl-Test-Simple
yum groupinstall ‘Development Tools’

Bene ora possiamo installare Openssl.

wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1f.tar.gz
tar xvf openssl-1.1.1f.tar.gz
mv openssl-1.1.1f openssl
cd openssl
./config –prefix=/usr/local/openssl –openssldir=/usr/local/openssl –libdir=/lib64 shared zlib dynamic
make -j4
make test
make install

Abbiamo scaricato la versione di OpenSSL openssl-1.1.1f per questo post, ma possiamo anche scaricare l’ultima versione. Successivamente decomprimiamo il file, rinominamo il nome della cartella e andiamo alla cartella; la voce OpenSSL. –prefix e –openssldir controlla la configurazione dei componenti installati. Il comportamento e le interazioni di –prefix e –openssldir sono leggermente diversi tra OpenSSL 1.0.2 e versioni precedenti e OpenSSL 1.1.0 e versioni successive. Impostiamo anche -prefix e -openssldir nella stessa posizione. shared forzerà la creazione di librerie condivise e Zlib significa che la compressione verrà eseguita utilizzando la libreria zlib. Vale la pena eseguire il make test per vedere se ci sono errori imprevisti. Se ce ne sono, è necessario correggerli prima di installare la libreria.

Ora rinomina il binario openssl esistente e aggiungiamo un nuovo collegamento simbolico.

mv /usr/bin/openssl /usr/bin/openssl-backup
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

Accedendo a /usr/bin, con ldd openssl ci verranno mostrate le dipendenze del comando openssl.

Ora se diamo nuovamente un opessl version, noteremo che abbiamo installato la versione Openssl 1.1.1f. I’ OpenSSL appena installato dovrebbe mostrare TLS v1.3 come di seguito.

openssl ciphers -v | awk ‘{print $2}’ | sort | uniq

Abbiamo completato la parte di installazione di OpenSSL. Ora dobbiamo ricompilare nuovamente Nginx per compilarlo a partire da OpenSSL appena installato.

Scaricare il codice sorgente della versione Nginx o Apache installata dal Web. Nel mio caso sul mio server di produzione è installata la versione 1.16.1 di Nginx, quindi scaricherò la stessa versione e inizierò a compilare.

./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body\ --http-proxy-temp-path=/var/lib/nginx/tmp/proxy \ 
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi \
--pid-path=/run/nginx.pid \
--lock-path=/run/lock/subsys/nginx --user=nginx \
--group=nginx \
--with-file-aio  \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-stream_ssl_preread_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-http_auth_request_module \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-pcre \
--with-pcre-jit \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-openssl=/usr/src/openssl

make -j4
make install

Vediamo ora, che Nginx è stato creato con OpenSSL appena installato, diamo il seguente comando per visualizzare.
nginx -V

Aggiorniamo ora la configurazione Nginx per abilitare TLS 1.3. Aggiungiamo le righe seguenti al blocco server della onfigurazione vhost Nginx.

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ‘ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256

nginx -t
service nginx restart

Ora con il seguente comando da shell è possibile verificare se utilizzaimo TLS1.2 o TLS1.3

openssl s_client -connect sitoweb:443 -tls1_3

(nell’inserimento del sito da controllare non inserire ne http, https e nemmeno il www, per controllare il TLS2 basterà sostituire tls3 con tls2

Questo è tutto. Abbiamo abilitato TLS 1.3 sul nostro server Nginx e funziona come previsto.

Se in qualche modo, il sito web o l’applicazione che avete installato non dovesse riprendere a funzionare a causa della nuova versione di OpenSSL, potreste anche dover ricompilare il PHP con le nuove intestazioni.

 

 

Pubblicato da appuntidiadam

Sistemista informatico, e grande appasionato di astronomia e fisica, ricercatore indipendente in cosmologia

Lascia un commento

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

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.