2013-05-27 13 views
8

Muszę połączyć się z usługą opartą na REST.Bouncy Castle Keystore (BKS): java.io.IOException: Zła wersja klucza sklepu

(https://someurl.com/api/lookup/jobfunction/lang/EN)

W IE lub Chrome przy próbie dostępu do tego adresu, uzyskać zaświadczenie, że muszę zaufać i przyjąć do kontynuowania Potem należy wprowadzić nazwę użytkownika i hasło, a potem uzyskać odpowiedź JSON.

To samo muszę zrobić programowo dla aplikacji na Androida.

  1. Próbowałem z niestandardowymi EasySSLSocketFactory i EasyX509TrustManager, nie działał. Wystąpił następujący błąd: java.security.cert.CertPathValidatorException: nie znaleziono zakotwiczenia zaufania dla ścieżki certyfikatu.

  2. użył kluczy BKS, należy pamiętać, że mykeystore.bks jest pusty plik, zanim wykonany poniżej poleceń

    keytool -importcert -v -trustcacerts -file "test.crt" -alias IntermediateCA -keystore "mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk15on-148.jar" -storetype BKS -storepass abcd1234 
    
    
    keytool -list -keystore "mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk15on-148.jar" -storetype BKS -storepass abcd1234 
    

MyHTTPClient.java wygląda jak poniżej:

public class MyHttpClient extends DefaultHttpClient { 

final Context context; 

public MyHttpClient(Context context) { 
    this.context = context; 
} 

@Override 
protected ClientConnectionManager createClientConnectionManager() { 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    // Register for port 443 our SSLSocketFactory with our keystore 
    // to the ConnectionManager 
    registry.register(new Scheme("https", newSslSocketFactory(), 443)); 
    return new SingleClientConnManager(getParams(), registry); 
} 

private SSLSocketFactory newSslSocketFactory() { 
    try { 
     // Get an instance of the Bouncy Castle KeyStore format 
     KeyStore trusted = KeyStore.getInstance("BKS"); 
     // Get the raw resource, which contains the keystore with 
     // your trusted certificates (root and any intermediate certs) 
     InputStream in = context.getResources().openRawResource(R.raw.mykeystore); 
     try { 
      // Initialize the keystore with the provided trusted certificates 
      // Also provide the password of the keystore 
      trusted.load(in, "abcd1234".toCharArray()); 
     } finally { 
      in.close(); 
     } 
     // Pass the keystore to the SSLSocketFactory. The factory is responsible 
     // for the verification of the server certificate. 
     SSLSocketFactory sf = new SSLSocketFactory(trusted); 
     // Hostname verification from certificate 
     // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506 
     sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); 
     return sf; 
    } catch (Exception e) { 
     throw new AssertionError(e); 
    } 
} 

Po wywołaniu usługi sieciowej pojawia się następujący błąd: Przyczyna: java.lang.AssertionError: java.io.IOException: Zła wersja ke y sklep

Proszę powiedzieć, co muszę zrobić, aby połączyć się z usługą webową opartą na protokole HTTPS, która ma nazwy użytkownika i poświadczenia passwd. ......

+1

Cześć, zawsze używaj bcprov-jdk15on-146.jar do tworzenia pliku magazynu kluczy. Rozwiązałem problem, używając bcprov-jdk15on-146.jar zamiast najnowszego bcprov-jdk15on-148.jar – user2290834

+0

nie ma bcprov-jdk15on-148.jar w moim katalogu instalacyjnym Java –

+0

Na to pytanie już udzielono odpowiedzi: http://stackoverflow.com/a/33197845/5459467 – Cukic0d

Odpowiedz

1

Wersja 148 słoika BC nie działa z Androidem. Użyj wersji 146 lub 147.

+0

Ciągle mam błąd w wersjach 146, 147 i 148 !! –

1

Mam pomoc od kogoś innego. rozwiązanie jest śledzić kroki:

  • 1, narzędzie do pobierania KeyStore Explorer
  • 2, Po zainstalowaniu otwórz swój certyfikat BKS, a następnie znaleźć Narzędzia-> Zmień typ
  • 3, wybierz BKS-V1, a następnie zapisać i użyj go.
Powiązane problemy