Java: come mostrare una finestra di dialogo per consentire all'utente di accettare i certificati SSL

StackOverflow https://stackoverflow.com/questions/1644059

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top