(Italiano) HTTPS Java Client e Certificati SSL

Sorry, this entry is only available in Italian. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

Questo breve post nasce come risposta a un quesito posto da lettore sull’articolo Importazione Certificati SSL sul Java Keystore (JKS) di qualche anno addietro e pubblicato sul mio blog. In quell’articolo era discussa la gestione dei Certificati Digitali sulla piattaforma Java e in particolare i repository key store e trust store.

La domanda posta ieri era la seguente:

Ciao Antonio,
ho un problema con i certificati e vedo che hai una risposta per tutto, ti è mai capitato di dover usare più certificati? …ma non appena riconfiguro le property di sistema per il secondo certificato ed invoco il secondo servizio va in eccezione (Connection has been shutdown: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target).

Certamente è possibile utilizzare più certificati che possono risiedere all’interno dello stesso trust store. Questo tipo di errore è classico, accade quando non è stato possibile eseguire la validazione della catena di certificazione (Certificate Chain). E’ possibile incappare in errori del genere quando per esempio si tenta di accedere a servizi che espongono un certificato non rilasciato da una Certification Authority o CA valida o comunque riconosciuta. Classico esempio sono i certificati rilasciati da CA interne a un’organizzazione.

La soluzione al problema è abbastanza semplice, occorre aggiungere al repository dei certificati tutta la catena di certificazione che ha firmato il certificato esposto dal servizio cui desiderate accedere. Solitamente, quando la locazione del trust store non è specificata, l’implementazione di  SunJSSE esegue la ricerca nelle seguenti directory:

  1. $JAVA_HOME/lib/security/jssecacerts
  2. $JAVA_HOME/lib/security/cacerts

Per aggiungere uno o più certificati al proprio repository si procede sempre con il tool keytool o altrimenti è anche possibile utilizzare tool di terze parti come per esempio KeyStore Explorer.  

Per l’occasione , ho realizzato un semplice client HTTPS che tenta di accedere a tre  risorse di cui una è “fake SSL”, ovvero, dispone di un certificato di tipo self-signed. L’accesso a quest’ultima risorsa sarà quindi negativo, fino a quando, in maniera esplicita, non aggiungeremo il certificato al nostro trust store.

Le risorse cui tenteremo di accedere sono quindi:

  • https://www.goodreads.com/book/show/18734728-enterprise-integration-with-wso2-esb?from_search=true (Risorsa con SSL OK)
  • https://www.liferay.com/it/products/liferay-portal/overview (Risorsa con SSL OK)
  • https://crm-shiruslabs.dontesta.it:8443/SugarEnt-Full-7.1.0 (Risorsa con SSL FAKE)

La prima esecuzione del programma java, quindi, senza nessun intervento sul trust store, darà esito positivo (accesso alla risorsa) per i primi e negativo per l’ultima. Nel Listato 1 è mostrato proprio ciò che accade con evidenza dell’errore per l’accesso all’ultima risorsa.

Dal log del Listato 1 è possibile vedere le informazioni sulla catena di certificazione per ogni risorsa a cui si sta facendo accesso. Sempre dal Listato 1 notare l’errore che si ottiene accedendo all’ultima risorsa: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target.

Aggiungendo quindi il certificato (che ricordo essere di tipo self-signed) al nostro trust store, ci saranno poi le condizioni per accedere alla risorsa senza alcun problema. Questa volta ho utilizzato il tool KeyStore Explorer per aggiungere il certificato tra quelli trust. In Figura 1 è mostrato il dettaglio del certificato con CN (Common Name) crm-shiruslabs.dontesta.it che sarà poi aggiunto al trust strore così come mostrato in Figura 2.

Figura 1 - Certificato Self-Signed da aggiungere al trust store.

Figura 1 – Certificato Self-Signed da aggiungere al trust store.

Figura 2 - Aggiunta del certificato al trust store.

Figura 2 – Aggiunta del certificato al trust store.

Una volta aggiunto il nuovo certificato al trust store, possiamo nuovamente eseguire il programma java e verificare che tutto vada a buon fine. Il Listato 2, mostra questa volta come l’accesso alla risorsa sia avvenuto in modo corretto.

Notare dal Listato 2 come non esiste una catena di certificazione per l’ultimo servizio, al contrario dei primi due, questo perchè si tratta di un certificato di tipo self-signed. Il programma di test realizzato per il post, più il JKS del trust store sono disponibili sul mio repository GitHub all’indirizzo HTTPS Java Client Example. Se avete la voglia e la fantasia di fare un test, il tutto è molto semplice, basta seguire le indicazioni riportate al Listato 3.

Da un commento a un articolo!

Liferay Portal Security AuditCos'è e come funzione il framework di Security Audit

Vi siete mai chiesti cos'è e come funziona il sistema di Security Audit di Liferay? Ho cercato di rispondere alla domanda non soffermandomi solo al "cosè e come funziona", sono andato ben oltre. Non vi resta che leggere questo EBook per scoprire.

Ottieni il tuo EBook

Antonio Musarra

I began my journey into the world of computing from an Olivetti M24 PC (http://it.wikipedia.org/wiki/Olivetti_M24) bought by my father for his work. Day after day, quickly taking control until … Now doing business consulting for projects in the enterprise application development using web-oriented technologies such as J2EE, Web Services, ESB, TIBCO, PHP.

You may also like...

Liferay SSL/TLS SecurityCome configurare il bundle Liferay per abilitare il protocollo SSL/TLS

Sei curioso di scoprire come configurare il bundle Liferay per funzionare in modalità sicura tramite protocollo SSL/TLS? In questo eBook ( #LFRDEPGUIDE ) ti spiego come farlo step-by-step; per il bundle Apache Tomcat e WildFly. Ricorda di lasciare un tuo feedback dopo averlo letto.