Sto cercando di stabilire una connessione HTTPS a server con un certificato scaduto nell'aprile 2013 e utilizza GlobalSign come certificato di origine.Creazione di una connessione HTTPS mediante URL.openConnection()
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
// urlConnection.setSSLSocketFactory(sslSocketFactory);
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);
// Send the POST data
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(postParamString.toString().getBytes("UTF8"));
// Read the reply
InputStream in = urlConnection.getInputStream();
Così com'è, questo getta javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.
quando getOutputStream()
si chiama.
Questo stesso sito e certificato sono validi nel browser Web HTC e nei browser desktop. Quando uso lo stesso codice per accedere a Google funziona (ma poi si lamenta di un errore 404). Vari post su StackOverflow implicano che dovrebbe "funzionare" e altri dicono di impostare il proprio keystore (o disabilitare tutte le convalide HTTPS!). Presumo che la differenza di comportamento sia dovuta a diversi keystore in uso (Qualcuno può chiarire questo ?).
Ora ho provato a creare un keystore utilizzando bouncy castle ma non riesco a farlo caricare sul mio dispositivo.
Dopo l'esportazione del certificato da Firefox, creo un archivio chiavi utilizzando:
keytool.exe -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -keystore res\raw\keystore
Questo viene poi caricata e utilizzata nell'applicazione utilizzando:
InputStream stream = context.getResources().openRawResource(R.raw.keystore);
// BKS seems to be the default but we want to be explicit
KeyStore ks = KeyStore.getInstance("BKS");
ks.load(stream, "www.onlinescoutmanager.co.uk".toCharArray());
stream.close();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
SSLContext context2 = SSLContext.getInstance("TLS");
context2.init(null, new TrustManager[] { defaultTrustManager }, null);
sslSocketFactory = context2.getSocketFactory();
Questo sta venendo a mancare con java.io.IOException: Wrong version of key store.
quando keystore.Load()
è chiamato.
Ho ensured I'm passing -storetype BKS
, used a <=7 character keystore password, aggiunto i certificati CA all'archivio chiavi e utilizzando entrambi i modelli Bouncy Castle 1.45 e 1.47 per creare l'archivio chiavi senza modifiche nel messaggio di errore segnalato.
Il mio ambiente è Eclipse Juno 4.2.1 con JRE 1.7u9b5 in esecuzione su Windows 8. Il dispositivo su cui sto eseguendo il test è HTC sensazione in esecuzione Android 2.3. L'applicazione ha una versione SDK minima di 7 e un target di 15.
Se qualcuno può spiegare come creare un key store BKS valido su Windows 8 o come posso ottenere Java per utilizzare lo stesso keystore del browser (o sistema?) che sarebbe apprezzato.
È possibile scaricare entire project come al momento della scrittura e il generated keystore se necessario.
Questa è sicuramente la migliore domanda formulata che abbia mai visto, su qualsiasi sito –
@AndreaLigios Ho dovuto rispondere a pochissimi, dovrei conoscere le regole e come "porre una domanda decente": p – Deanna
@ Deanna quando crei il keystore, dovresti avere -trustedcacerts nelle opzioni in modo che convalidi il certificato usando i certificati attendibili? (Neve ha funzionato con la supposizione di BKS basata su somiglianze java di base) –