Il 23/03/21 15:58, Piviul ha scritto:
Grazie mille Paolo, ho ancora molta confusione; prima di capire cosa
vuole tomcat mi piacerebbe allora capire cosa mi restituisce
letsencrypt. Letsencrypt come dicevo genera 4 files: privkey.pem,
fullchain.pem, chain.pem e cert.pem. Accompagnati a questi 4 files c'è
il seguente README:
This directory contains your keys and certificates.
`privkey.pem` : the private key for your certificate.
`fullchain.pem`: the certificate file used in most server software.
`chain.pem` : used for OCSP stapling in Nginx >=1.3.7.
`cert.pem` : will break many server configurations, and should
not be used
without reading further documentation (see link below).
WARNING: DO NOT MOVE OR RENAME THESE FILES!
Certbot expects these files to remain in this location in order
to function properly!
We recommend not moving these files. For more information, see the
Certbot
User Guide at
https://certbot.eff.org/docs/using.html#where-are-my-certificates.
Secondo te quindi fullchain.pem è un certificato che contiene anche la
catena dei certificati?
Esatto, fullchain.pem contiene certificato + catena, che in sostanza
corrisponda a
$ cat cert.pem chain.pem > fullchain.pem
quindi puoi inserire in una configurazione le seguenti pseudo-direttive
(da riscrivere in base al server utilizzato):
> Certificato: fullchain.pem
> Chiave privata: privkey.pem
oppure
> Certificato: cert.pem
> Catena CA; chain.pem
> Chiave privata: privkey.pem
Inoltre ora tomcat sono riuscito a farlo funzionare con un certificato
autofirmato. Il certificato l'ho generato con un tool di tomcat che si
chiama keytool. Questo è il comando lanciato:
$ keytool -keysize 2048 -genkey -validity 1825 -keyalg RSA -alias
tomcat -keystore .keystore
Non conosco keystore e keytool, ho cercato un po' di info sulla manpage
e da quello che ho visto il keystore è un db di materiale crittografico
gestibile con keytool (man di keytool):
> The keytool command is a key and certificate management utility. It
enables users to administer their own
> public/private key pairs and associated certificates for use in
self-authentication (where the user
> authenticates himself or herself to other users and services) or data
integrity and authentication services,
> using digital signatures. The keytool command also enables users to
cache the public keys (in the form of
> certificates) of their communicating peers.
Il comando genkeypair (genkey è il vecchio nome che è meglio evitare di
usare, vedi man) genera chiave privata e chiave pubblica e da questa
genera un certificato autofirmato.
Una volta lanciato quel comando mi chiede una password e una serie di
informazione che poi compaiono nel certificato stesso (tipo nome,
cognome, azienda provincai, stato...).
Queste sono le informazioni che poi verranno inserite nel certificato
Poi ho copiato il file .keystore generato nella directory di tomcat e
ho dovuto mettere i riferimenti del file .keystore generato e la
password utilizzata nel file server.xml di tomcat:
<?xml version="1.0" encoding="UTF-8"?>
[...]
<!-- Define an SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="/etc/tomcat9/.keystore"
keystorePass="password utilizzata nella generazione del certificato"
clientAuth="false" sslProtocol="TLS"/>
Secondo te quindi il file .keystore contiene certificato e catena?
Qual'è il senso, secondo te, che io e tomcat condividiamo una stessa
password affinché tomcat possa utilizzare il certificato? Per caso sai
indirizzarmi su come si possa, con keytool, trasformare il certificato
letsencrypt in un certificato valido per tomcat?
keystore.db contiene il certificato, catena (in questo caso una sola CA,
la quella locale) e la chiave privata, in un formato tutto suo, che
dovrebbe poter contenere tutti i certificati necessari a java.
Le password sulle chiavi pubbliche che devono essere utilizzate da un
servizio secondo me sono sostanzialmente inutili se non dannose, perché,
come noti, poi devi comunque metterle in chiaro da qualche parte sul
sistema oppure essere presente ad ogni riavvio o crash per poterla
inserire ed fare ripartire il servizio...
Però se java lo richiede c'è poco da fare, potresti solo vedere se è
possibile generare un keystore senza password.
Ho visto che keytool ha una serie di parametri per generare i csr per la
richiesta di certificati a CA esterne (certreq) e per la loro
importazione dopo averli ricevuti (importcert), ma questo non si adatta
bene alla filosofia di let's encrypt, che punta tutto sull'automazione
del processo e il rinnovo ogni 3 mesi.
La soluzione più semplice è quella che ti hanno già suggerito, ovvero un
reverse proxy con nginx o apache che faccia da frontend TLS.
Alternativamente puoi vedere se le direttive citate in [1] possono
essere utilizzate con symlink ai file di certbot, di certo non è
pensabile di ricordarsi di copiare a mano i certificati ogni 90 giorni.
[1]
https://medium.com/@raupach/how-to-install-lets-encrypt-with-tomcat-3db8a469e3d2
Grazie mille
Piviul
--
Mandi.
Paolo