Java: come mostrare una finestra di dialogo per consentire all'utente di accettare i certificati SSL
-
10-07-2019 - |
Domanda
Attualmente sto avendo un certificato autofirmato per il mio server web HTTPS.
Nel mio programma Java è presente un SSLSocketFactory che creerà un socket per il server web. L'implementazione predefinita di sun blocca il certificato autofirmato. Con una propria implementazione di X509TrustManager posso solo verificare se la data del certificato è valida.
Esiste la possibilità che l'implementazione predefinita verifichi la validità (data e nome host, ...) e se non viene visualizzata una finestra di dialogo per consentire all'utente di accettare questo certificato?
Ogni codice che ho trovato fino ad ora disabilita solo il controllo ssl e accetta tutti i certificati non validi.
Soluzione
In realtà non l'ho provato, ma perché non è possibile implementare il proprio gestore della fiducia, che per primo delega al gestore della fiducia predefinito per verificare se il certificato è valido e, in caso contrario, chiede all'utente se desidera ancora accettare il certificato?
È possibile inizializzare la maggior parte delle classi di sicurezza con argomenti null per utilizzare i valori predefiniti. Per ottenere il gestore fiducia predefinito, è necessario ottenere i gestori fiduciari disponibili e scegliere il primo nelle mgrs array per implementare l'interfaccia X509TrustManager
. Di solito, l'array conterrà comunque solo un elemento.
TrustManagerFactory trustmanagerfactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustmanagerfactory.init((KeyStore)null);
TrustManager[] mgrs = trustmanagerfactory.getTrustManagers();
Dopo aver avvolto il Trust Manager predefinito con la propria estensione, è necessario inizializzare un contesto SSL e ottenere un factory socket da esso:
SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, new TrustManager[] {myTm}, null);
SSLSocketFactory sf = sslContext.getSocketFactory();
Quindi utilizzare questo factory socket per creare nuovi socket client o passarlo a HttpsURLConnection.setDefaultSSLSocketFactory
per utilizzare il protocollo https negli URL con il proprio gestore di fiducia.