Strong Authentication
Indice |
Obiettivo:
Si vuole proteggere una pagina / webapp in tomcat con un autenticazione forte, in maniera cioe' che il server permetta l'accesso solo ad un client che si presenti con un certificato ritenuto valido.
Creare una CA (Certificate Authority) locale
Utilizzo a scopo commerciale
In un caso di utilizzo a scopo commerciale il nostro certificato andrebbe firmato da una CA reale come VeriSign o altre, a scopo sia di studio che di utilizzo in una Intranet privata creeremo invece un CA locale. Per questo c'e un makefile pronto, l'unico passo obbligatorio e' modificare il file openssl.conf per adattarlo alle proprie necessita', specificando i parametri obbligatori “commonName”, ”organizationName”, “countryName”, “stateOrProvinceName” e se si vuole i facoltativi “organizationalUnitName” ed “emailAddress”, dopodiche' nella directory dove c'e il makefile:
$> make init
Nella directory viene creata la struttura necessaria alla CA locale, in particolare il file ca-key.pem sara' il certificato principale della CA.
Lato Server
Creare un Java Keystore ( .jks) lato server, al suo interno un alias per il server con una coppia di chiavi RSA: n.b. $SERVER e' la variabile a cui sostituire il nome server
$> keytool -genkey -alias $SERVER -keyalg RSA -keystore $SERVER.jks -validity 365
Generare una Certificate Signing Request (.csr) per le chiavi server:
$> keytool -certreq -keyalg RSA -alias $SERVER -file $SERVER.csr -keystore $SERVER.jks
Firmare la richiesta generando un Certificato (.cert)
$> make sign
Convertire il Certificato in un formato adatto al keystore dove andra' importato
$> openssl x509 -in $SERVER.cert -out $SERVER-der.cer -outform DER n.b. L'out ha estensione .cer e non .cert per windows
Completare il primo Keystore importando al suo interno due certificati: prima quello della CA per ragioni di dipendenza tra i due e poi quello server:
$> keytool -import -alias root -keystore $SERVER.jks -trustcacerts -file ca-cert.pem $> keytool -import -alias $SERVER -file $SERVER-der.cer -keystore $SERVER.jks
Creare un Keystore CA , che conterra' solo certificati ma di entrambe le parti
$> keytool -import -alias ca-cert -keystore cacerts.jks -file ca-cert.pem -trustcacerts
Lato Client
Generare le chiavi RSA del client
$> openssl genrsa -des3 -out $CLIENT.key 1024
Generare la richiesta CSR per il client
$> openssl req -key $CLIENT.key -new -out $CLIENTE.csr
Firmare la richiesta ed ottenere un Certificato (.cer) client
$> make sign
Combinare Chiavi (.key) e Certificato (.cer) in un unico package PKCS12 (.pfx)
$> openssl pkcs12 -export -inkey $CLIENT.key -in $CLIENT.cer -out $CLIENT.pfx
Installazione e Configurazione
La procedura eseguita fino a qui rilascia 3 file rilevanti: i due Java Keystore $SERVER.jks e cacerts.jks e un file $CLIENT.pfx.
Lato Server
Copiare i due Keystore sotto la dir /conf di Tomcat Editare il file server.xml sotto la dir /conf di Tomcat, e modificare la sezione relativa ai connettori Ssl da cosi:
<Connector port="8443" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" debug="0" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"/>
a cosi:
<Connector port="443" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" debug="0" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="conf\$SERVER.jks" keystorePass="changeit" truststoreFile="conf\cacerts.jks" truststorePass="changeit"/>
modificando quindi: • La porta, da 8443 a 443, che e' la porta di default per https • La variabile “clientAuth” da “false” a “true” • Aggiungendo le due righe relative ai Keystore Jks
Lato Client
Importare il file $CLIENT.pfx nel browser
Autore: Federico Pallante mailto:vaquerito@slacky.it