Sto utilizzando Java 6 e sto cercando di creare un HttpsURLConnection
su un server remoto, utilizzando un certificato client.
Il server utilizza un certificato radice autofirmato e richiede che venga presentato un certificato client protetto da password. Ho aggiunto il certificato di root del server e il certificato del client a un keystore java predefinito che ho trovato in /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5). Il nome del file di archivio chiavi sembra suggerire che il certificato client non deve essere inserito lì?Certificati client Java su HTTPS/SSL
In ogni caso, aggiungendo il certificato principale di questo negozio risolto il famigerato javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
Tuttavia, ora sto bloccato su come utilizzare il certificato client. Ho provato due approcci e nessuno mi porta da nessuna parte.
In primo luogo, e preferito, provate:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://somehost.dk:3049");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();
// The last line fails, and gives:
// javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
Ho provato saltare la classe HttpsURLConnection (non è l'ideale in quanto voglio parlare HTTP con il server), e fare questo, invece:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("somehost.dk", 3049);
InputStream inputstream = sslsocket.getInputStream();
// do anything with the inputstream results in:
// java.net.SocketTimeoutException: Read timed out
Non sono nemmeno sicuro che il certificato del cliente sia il problema qui.
Ho usato un URL come: https: // localhost: 8443/Nome_applicazione/getAttributes. Ho un metodo con/getAttribute url mapping. Questo metodo restituisce un elenco di elementi. Ho usato HttpsUrlConnection, il codice di risposta della connessione è 200, ma non mi fornisce l'elenco degli attributi quando uso inputStream, mi dà il contenuto html della mia pagina di accesso. Ho fatto l'autenticazione e impostare il tipo di contenuto come JSON. Si prega di suggerire – Deepak