Rinnovare un certificato TLS in Tomcat


La procedura per rinnovare il certificato SSL/TLS nel keystore di Tomcat dipende tipicamente dal tipo di certificato o meglio dall’ente certificatore.

Nelle ultime versioni di Tomcat l’uso del keystore, come abbiamo visto negli articoli precedenti, non è più necessario rendendo il rinnovo del certificato più semplice in quanto basta sostituire i file della chiave, della full-chain e riavviare Tomcat.

Tuttavia l’uso del keystore è ancora molto popolare quindi se vi ritrovate a dover rinnovare il certificato è probabile che dobbiate usare il keystore e lo strumento per la gestione: il keytool.

Nel caso di Letsencrypt i passaggi sono piuttosto semplici e automatizzabili: consistono nella cancellazione del certificato dal keystore e dall’importazione del nuovo, più riavvio di Tomcat.

Se invece il vostro certificato viene rilasciato da un rivenditore di certificati, la procedura solitamente prevede:

  • la creazione di un CSR (Certificate Signing Request) a partire dal certificato+chiave memorizzato nel keystore,
  • l’invio del CSR al rivenditore,
  • la verifica dell’identità del richiedente tramite DNS, mail o inserimento di una pagina web ad hoc,
  • la ricezione del certificato,
  • il caricamento del certificato nonchè del certificato root CA e dell’intermedio nel keystore
  • il riavvio di Tomcat.

Per verificare quali certificati sono presenti nel proprio keystore si può usare il comando (dove miokeystore.jks è il nome del proprio keystore):

keytool -list -keystore miokeystore.jks

Nella schermata precedente, ci sono 3 certificati: intermediate e root sono quelli della CA, mentre mydomain è il nostro certificato con chiave (PrivateKeyEntry) di Tomcat.

Facciamo una copia di backup del keystore

cp miokeystore.jks miokeystore.jks_backup

Per procedere alla generazione del CSR abbiamo bisogno della password del keystore e di sapere quale è l’alias che Tomcat usa per il certificato. Nel nostro caso è mydomain, quindi possiamo lanciare questo comando:

keytool -certreq -alias mydomain -file tomcat.csr -keystore miokeystore.jks

Verrà generato un file chiamato tomcat.csr partendo dal certificato con chiave contenuto nel keystore miokeystore.jks; il file tomcat.csr (non contiene la chiave) va passato al rivenditore di certificati.

A questo punto il rivenditore permette di scegliere un metodo di identificazione e autenticazione del proprietario del dominio. Scelto il metodo e verificato il proprietario, allora ci viene fornito il certificato del dominio in formato testuale.

Questo certificato spesso non è sufficiente da solo ma è necessario aggiungere nel keystore tutta la catena dei certificati, iniziando con il certificato della root CA, poi quello intermedio e poi il certificato del dominio.

Supponendo di dover sostituire il root CA e l’intermedio già presente nel keystore, bisogna eliminarli entrambi (solo se non ci sono altri certificati nel keystore che li usando, ovviamente).

I vecchi certificati intermediate e root possono essere eliminati:

keytool -delete -alias intermediate -keystore miokeystore.jks
keytool -delete -alias root -keystore miokeystore.jks

Non va cancellato il certificato con chiave mydomain.

I nuovi certificato root e intermediate che sono stati scaricati dal sito del rivenditore o della certification authority possono essere importati così:

keytool -import -trustcacerts -alias root -file DigiCert_Global_G2.pem -keystore miokeystore.jks

Dove DigiCert_Global_G2.pem è il certificato della Root CA.

keytool -import -trustcacerts -alias intermediate -file DigiCertGlobalCAG2.pem -keystore miokeystore.jks

Dove DigiCertGlobalCAG2.pem è il certificato della Intermediate CA.

Importiamo ora il certificato ricevuto dal rivenditore, supponiamo che il certificato sia contenuto nel file mydomain.txt

keytool -import -alias mydomain -file mydomain.txt -keystore miokeystore.jks

Così facendo il nuovo certificato verrà unito alla chiave già presente nel keystore.

Per far ripartire Tomcat su Debian o CentOS

systemctl restart tomcat9

Se l’importazione è stata effettuata in maniera corretta, il riavvio di Tomcat sarà completato con successo, altrimenti è possible che Tomcat non riesca a ripartire.

In tal caso, è possibile ripristinare il keystore originale (antecedente alle modifiche) e analizzare cosa è andato storto.

Una delle verifiche da fare è la corretta importazione del certificato con chiave. Infatti il certificato senza chiave non permette la partenza di Tomcat. Per verificare se c’è il certificato con chiave, basta cercare nell’output della lista se c’è PrivateKeyEntry.

keytool -list -keystore miokeystore.jks

Come attivare HTTPS su Tomcat

In questa guida vediamo come configurare il supporto HTTPS, tramite Transport Layer Security (TLS), su Tomcat.
Tomcat sfrutta le tecnologie Java sottostanti per fornire il supporto alle connessioni sicure e per questo motivo la configurazione di TLS su Tomcat non è così immediata come per il classico Apache HTTPD.

Questo articolo fa riferimento alla versione Tomcat 9, per dettagli sulla configurazione potete leggere questi due articoli: Installare Tomcat su Ubuntu 20.04 Focal Fossa e installare Tomcat su CentOS 8.

Nel resto dell’articolo supporremo che il nostro server Tomcat abbia come dominio tomcat.example.com, per cui nei successivi comandi dovrete sostituire tomcat.example.com con il nome del vostro dominio.

Abbiamo usato Letsencrypt per generare un certificato TLS gratuito da usare per il nostro Tomcat.
Per installare Letsencrypt su Ubuntu usare il comando:

sudo apt install letsencrypt

Per generare il certificato, dopo aver installato Letsencrypt:

certbot certonly --standalone -d tomcat.example.com

Attendiamo la fine del comando precedente e convertiamo il certificato e la chiave in un formato p12 utilizzabile per il java keytool. Il tipo di file p12 con certificato full chain e chiave, ci consente di fare un singolo inserimento del keystore. L’alternativa è quella di aggregare chiave e certificato del dominio in un file da aggiungere al keystore. Poi sia il certificato intermedio sia quello root vanno anche essi importati in 2 passaggi nel keystore; invece con il file p12, l’importazione è una sola.

Detto questo, aggreghiamo i vari componenti per creare un file p12:

openssl pkcs12 -export -out /tmp/tomcat.example.com_fullchain_and_key.p12 \
-in /etc/letsencrypt/live/tomcat.example.com/fullchain.pem \
-inkey /etc/letsencrypt/live/tomcat.example.com/privkey.pem \
-name tomcat

A questo punto ci viene chiesta una password, scegliamo per esempio 58dssqPo2Muw
La password ci servirà successivamente.
Ora lanciamo il seguente comando, avendo cura di sostituire 58dssqPo2Muw con la password da voi scelta e tomcat.example.com con il vostro dominio.

keytool -importkeystore \
-deststorepass 58dssqPo2Muw -destkeypass 58dssqPo2Muw \
-destkeystore /tmp/tomcat.example.com.jks \
-srckeystore /tmp/tomcat.example.com_fullchain_and_key.p12 \
-srcstoretype PKCS12 -srcstorepass 58dssqPo2Muw \
-alias tomcat

Copiamo il file /tmp/tomcat.example.com.jks in una nuova cartella chiamata tls che si troverà in /usr/local/tomcat9/

mkdir /usr/local/tomcat9/tls/
cp /tmp/tomcat.example.com.jks /usr/local/tomcat9/tls/

Aprite il file di configurazione di Tomcat che si chiama server.xml e si trova nella cartella conf dell’installazione di Tomcat. Se avete seguito i tutorial precedenti si dovrebbe trovare in /usr/local/tomcat9/conf/server.xml

nano /usr/local/tomcat9/conf/server.xml

Inserite il seguente testo avendo cura di sostituire la password e il dominio.

<Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="tls/tomcat.example.com.jks"
           keystorePass="58dssqPo2Muw"
           clientAuth="false" sslProtocol="TLS"/>

Ora riavviate Tomcat con il comando

systemctl restart tomcat9

Ora se andrete sull’indirizzo
https://tomcat.example.com:8443 dovrà compare la solita pagina di inizio di Tomcat.

Se avete problemi vi consiglio di consultare il file /usr/local/tomcat9/logs/catalina.out per capire quale è l’errore che ha impedito l’attivazione corretta di https su Tomcat.

Per maggiori dettagli, la guida di configurazione è indicata: http://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html

Installare Tomcat su Ubuntu 20.04 Focal Fossa

In un precendente tutorial abbiamo visto come installare Tomcat su CentOS 8, ora vediamo come installare il popolare application server su Ubuntu 20.04 Focal Fossa.

Dopo aver installato Ubuntu 20.04, versione server, è sufficiente installare il Java JDK versione 8 sul server.

sudo apt install openjdk-8-jdk

Create un utente chiamato tomcat9 e create una cartella per ospitare i file di Tomcat.

sudo useradd -r tomcat9
mkdir /usr/local/tomcat9

Poi scaricate da Internet l’ultima versione di Tomcat 9 per sistemi GNU/Linux, usando questo comando:

wget http://mirror.nohup.it/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz -O apache-tomcat-9.0.34.tar.gz

Qualora il comando vi restituisca un errore, recatevi alla pagina http://mirror.nohup.it/apache/tomcat/tomcat-9/v9.0.34/bin/ e selezionate una versione più recente es. nel caso di una futura 9.0.35 l’url può essere trasformato così: wget http://mirror.nohup.it/apache/tomcat/tomcat-9/v9.0.35/bin/apache-tomcat-9.0.35.tar.gz -O apache-tomcat-9.0.35.tar.gz

Scompattiamo l’archivio di Tomcat nella cartella predisposta prima.

tar zxvf apache-tomcat-9.0.*.tar.gz --strip-component=1 -C /usr/local/tomcat9

Facciamo sì che tutti i file di Tomcat nella cartella /usr/local/tomcat9 siano di proprietà dell’utente tomcat9

sudo chown -R tomcat9:tomcat9 /usr/local/tomcat9

Per poter avviare Tomcat in maniera automatica è opportuno creare uno script per systemd. Creiamo quindi un file di tipo service:

nano /etc/systemd/system/tomcat9.service

In questo file incolliamo il seguente testo:

[Unit]
 Description=Apache Tomcat Server
 After=syslog.target network.target

 [Service]
 Type=forking
 User=tomcat9
 Group=tomcat9

 Environment=CATALINA_PID=/usr/local/tomcat9/temp/tomcat.pid
 Environment=CATALINA_HOME=/usr/local/tomcat9
 Environment=CATALINA_BASE=/usr/local/tomcat9

 ExecStart=/usr/local/tomcat9/bin/catalina.sh start
 ExecStop=/usr/local/tomcat9/bin/catalina.sh stop

 RestartSec=10
 Restart=always

 [Install]
 WantedBy=multi-user.target

Salvato il file è necessario ricaricare la lista dei servizi gestiti da systemd, lo si può fare col comando:

sudo systemctl daemon-reload

Per abilitare l’avvio automatico di Tomcat alla partenza del sistema operativo lanciare questo comando:

sudo systemctl enable tomcat9.service

Per lanciare Tomcat usare invece quest’altro comando:

sudo systemctl start tomcat9.service

A questo punto è possibile collegarsi a Tomcat usando l’indirizzo http://localhost:8080 dal server locale.

Abilitare l’accesso a Tomcat dall’esterno

Di default, Tomcat non consente l’accesso da IP esterni al server di installazione. Questo per motivi di sicurezza.

Per consentire l’accesso dall’esterno, bisogna modificare il file /usr/local/tomcat9/conf/server.xml aggiungendo nella sezione Connector port=”8080″, la coppia opzione-valore address=”0.0.0.0″

A questo punto occorre ricaricare (o riavviare) Tomcat.

sudo systemctl reload tomcat9.service

Ora ci si può collegare dall’esterno, nell’esempio l’IP del server Ubuntu con Tomcat 9 è 192.168.217.7:

Installare Tomcat su CentOS 8

CentOS 8 è l’ultima versione di CentOS uscita appena qualche giorno fa. Vediamo in questo articolo come instalare Tomcat su CentOS 8.

Tomcat è il famoso application server per eseguire applicazioni, war, scritte in Java.

La prima cosa da fare, se non l’avete già fatto, è installare il java developer kit (o JDK) su CentOS. Si può optare per la versione openJDK oppure per la versione ufficiale di Oracle.

In questo tuttorial scegliamo la versione open. A sua volta possiamo scegliere fra openJDK 8 e l’ultima versione LTS openJDK 11. La scelta va fatta in base alle vostre esigenze e al vostro codice.

Continua a leggere