Ich versuche, eine HTTPS-Verbindung zu einem server herzustellen, dessen Zertifikat im April 2013 abgelaufen ist und das GlobalSign als Stammzertifikat verwendet.Herstellen einer HTTPS-Verbindung mithilfe von 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();
Wie es aussieht, dies wirft javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.
wenn getOutputStream()
genannt wird.
Die gleiche Website und das gleiche Zertifikat sind im HTC Webbrowser und Desktop-Browser gültig. Wenn ich den gleichen Code verwende, um auf Google zuzugreifen, funktioniert es (aber beschwert sich dann über einen 404-Fehler). Verschiedene Posts auf StackOverflow implizieren, dass es "einfach funktioniert" und andere sagen, dass Sie Ihren eigenen Schlüsselspeicher einrichten (oder alle HTTPS-Validierung deaktivieren!) Ich nehme an, der Unterschied im Verhalten ist auf verschiedene Stammschlüssel speichert im Einsatz (Kann jemand dies klären ?).
Ich habe jetzt versucht, einen Schlüsselspeicher mit Hüpfburg zu erstellen, aber ich kann das nicht auf meinem Gerät laden.
Nachdem das Zertifikat von Firefox exportieren, erstelle ich einen Schlüsselspeicher mit:
keytool.exe -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -keystore res\raw\keystore
Dies wird dann in der Anwendung geladen und verwendet werden:
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();
Dies wird mit java.io.IOException: Wrong version of key store.
versagt, wenn keystore.Load()
wird genannt.
Ich habe ensured I'm passing -storetype BKS
, used a <=7 character keystore password, die CA-Zertifikate in den Schlüsselspeicher hinzugefügt, und beide Bouncy Castle Version 1.45 und 1.47 verwenden, um den Schlüsselspeicher ohne Änderung in der gemeldeten Fehlermeldung zu erstellen.
Meine Umgebung ist Eclipse Juno 4.2.1 mit JRE 1.7u9b5 unter Windows 8. Das Gerät, das ich testen, ist ein HTC Sensation laufenden Lager Android 2.3. Die Anwendung hat eine SDK-Mindestversion von 7 und ein Ziel von 15.
Wenn jemand erklären kann, wie ein gültiger BKS-Schlüsselspeicher unter Windows 8 erstellt wird oder wie ich Java dazu bringen kann, denselben Schlüsselspeicher wie den Browser zu verwenden (oder System?) das würde geschätzt werden.
Sie können die entire project zum Zeitpunkt des Schreibens und die generated keystore bei Bedarf herunterladen.
Dies ist definitiv die am besten formulierte Frage, die ich je gesehen habe, auf jeder Seite –
@AndreaLigios Ich habe ein paar weit zu beantworten, ich sollte die Regeln kennen und wie man eine anständige Frage "p Frage – Deanna
@ Deanna, wenn Sie den Schlüsselspeicher erstellen, sollten Sie -trustedcacerts in den Optionen haben, damit das Zertifikat mit den vertrauenswürdigen Zertifikaten validiert wird? (Neve arbeitete mit BKS Raten basierend auf Core Java Ähnlichkeiten) –