2013-05-27 25 views
8

RESTベースのWebサービスに接続する必要があります。Bouncy Castleキーストア(BKS):java.io.IOException:キーストアのバージョンが正しくありません

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

IEやChromeブラウザ、私はこのURLにアクセスしようとすると、私はユーザー名とパスワードを入力する必要があり、その後、私、私はその後 を継続するために信頼し、受け入れなければならない証明書を取得するにはJSONレスポンスを取得します。

同じことAndroidアプリのためにプログラム的に行う必要があります。

  1. カスタムEasySSLSocketFactoryとEasyX509TrustManagerで試してみました。Didnt work。 次のエラーが発生しました。 java.security.cert.CertPathValidatorException:証明書パスの信頼アンカーが見つかりません。 BKSキーストアを使用し

  2. 、 mykeystore.bks iは以下を実行する前に

    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は、以下のように見えるのコマンド空のファイルであることに注意してください。

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); 
    } 
} 

webserviceを呼び出すと、以下のエラーが表示されます。 原因:java.lang.AssertionError:java.io.IOException:間違ったkeのバージョンy store

usernameとpasswdの資格情報を持つHTTPSベースの残りのWebサービスに接続するために必要なことを教えてください。 ......

+1

こんにちは、キーストアファイルの作成には常にbcprov-jdk15on-146.jarを使用してください。最新のbcprov-jdk15on-148.jarの代わりにbcprov-jdk15on-146.jarを使用して問題を解決しました – user2290834

+0

Javaインストールディレクトリにbcprov-jdk15on-148.jarがありません –

+0

質問はすでにここで回答済みです: http://stackoverflow.com/a/33197845/5459467 – Cukic0d

答えて

1

BC jarのバージョン148は、Androidでは動作しません。バージョン146または147を使用してください。

+0

バージョン146、147、148でエラーが発生しました。 –

1

他の人から助けを受けました。

  • 1、ダウンロードツールKeyStore Explorer
  • 2、後に続い保存し、BKS-V1を選択し、[ツール] - > [タイプの変更
  • 3を見つけ、あなたのBKS証明書を開いて、インストールします。 ソリューションは、手順を実行するありますそれを使用してください。
関連する問題