Próbuję utworzyć połączenie HTTPS z numerem server, którego zestaw certyfikatów wygasa w kwietniu 2013 r. I używa GlobalSign jako głównego certyfikatu.Tworzenie połączenia HTTPS przy użyciu adresu 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();
W obecnej formie, to rzuca javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.
gdy getOutputStream()
nazywa.
Ta sama strona i certyfikat są ważne w zapasowej przeglądarce HTC i przeglądarkach komputerowych. Kiedy używam tego samego kodu, aby uzyskać dostęp do Google, działa (ale potem narzeka na błąd 404). Różne posty na StackOverflow sugerują, że powinna "po prostu działać", a inni mówią, aby skonfigurować własny magazyn kluczy (lub wyłączyć wszystkie walidacje HTTPS!) Zakładam, że różnica w zachowaniu zależy od różnych używanych magazynów kluczy głównych (Czy ktoś może to wyjaśnić? ?).
Próbowałem już stworzyć kluczowy sklep z dmuchanym zamkiem, ale nie mogę go załadować na moje urządzenie.
Po wyeksportowaniu certyfikat z Firefox utworzyć magazyn kluczy przy użyciu:
keytool.exe -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -keystore res\raw\keystore
ta jest następnie załadowane i wykorzystywane w aplikacji za pomocą:
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();
to niepowodzeniem z java.io.IOException: Wrong version of key store.
gdy keystore.Load()
jest nazywany.
Posiadam ensured I'm passing -storetype BKS
, used a <=7 character keystore password, dodałem certyfikaty CA do magazynu kluczy i używam obu wersji Bouncy Castle w wersji 1.45 i 1.47 do utworzenia magazynu kluczy bez zmian w zgłoszonym komunikacie o błędzie.
Moje środowisko to Eclipse Juno 4.2.1 z oprogramowaniem JRE 1.7u9b5 działającym pod kontrolą systemu Windows 8. Urządzenie, na którym testuję, to urządzenie HTC z systemem Android 2.3. Aplikacja ma minimalną wersję SDK 7 i cel 15.
Jeśli ktokolwiek może wyjaśnić, jak utworzyć prawidłowy magazyn kluczy BKS w systemie Windows 8 lub jak uzyskać Javę do korzystania z tego samego magazynu kluczy co przeglądarka (lub system?), który byłby doceniony.
Możesz pobrać entire project, tak jak to było w czasie pisania, i generated keystore, jeśli jest to wymagane.
To zdecydowanie najlepsze sformułowane pytanie, jakie kiedykolwiek widziałem, na każdej stronie. –
@AndreaLigios Musiałem odpowiedzieć na nieliczne, powinienem znać zasady i jak "zadać przyzwoite pytanie": p – Deanna
@ Deanna, kiedy tworzysz magazyn kluczy, czy powinieneś -trustedcacerts w opcjach, aby sprawdził poprawność certyfikatu za pomocą zaufanych certyfikatów? (Neve pracował z odgadywaniem BKS opartym na podobieństwach jądra Java) –