14

証明書の有効期限が 2013 年 4 月に設定されていて、GlobalSign をルート証明書として使用しているサーバーに HTTPS 接続しようとしています。

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

現状では、これは呼び出されたjavax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.ときにスローします。getOutputStream()

この同じサイトと証明書は、標準の HTC Web ブラウザーとデスクトップ ブラウザーで有効です。同じコードを使用してGoogleにアクセスすると動作します (ただし、404 エラーが発生します)。StackOverflow に関するさまざまな投稿は、それが「正常に機能する」ことを暗示しており、他の人は独自のキー ストアをセットアップする (またはすべての HTTPS 検証を無効にする!) と言っています。 ?)。

バウンシーキャッスルを使用してキーストアを作成しようとしましたが、これをデバイスにロードできません。

Firefox から証明書をエクスポートした後、次を使用してキー ストアを作成します。

keytool.exe -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -keystore res\raw\keystore

次に、これがロードされ、次を使用してアプリケーションで使用されます。

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

これは呼び出されjava.io.IOException: Wrong version of key store.たときに失敗しています。keystore.Load()

は合格していることを確認し-storetype BKS、<=7 文字のキーストア パスワードを使用し、CA 証明書をキー ストアに追加し、Bouncy Castle バージョン 1.45 と 1.47 の両方を使用して、報告されたエラー メッセージを変更せずにキー ストアを作成しました。

私の環境は、Windows 8 で実行されている JRE 1.7u9b5 を備えた Eclipse Juno 4.2.1 です。私がテストしているデバイスは、ストック Android 2.3 を実行している HTC センセーションです。アプリケーションの SDK の最小バージョンは 7 で、ターゲットは 15 です。

Windows 8 で有効な BKS キー ストアを作成する方法、または Java でブラウザ (またはシステム?) と同じキー ストアを使用する方法を説明できる人がいれば、それを歓迎します。

執筆時点のプロジェクト全体と、必要に応じて生成されたキーストアをダウンロードできます。

4

2 に答える 2

3

これについてのヒントをくれたさまざまな人々のおかげで、それが機能するためにすべてが正しい必要がある複数のことがあります。

  1. HTTPSサイトの証明書が信頼されたルート証明書によって署名されている場合、カスタムなしですぐに機能しますSSLSocketFactory。信頼されたルート証明書は、ブラウザーで使用されるものとは異なる可能性があるため、Android Webブラウザーで機能する場合は、アプリで機能するとは限りません。
    信頼されたルート証明書ではなく、のような例外が発生した場合は、次のようjavax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.にキーストアを作成してロードする必要があります。

  2. キーストアは、コマンドラインで指定してBouncy Castleプロバイダー( 1 )を使用して生成する必要があります。 バウンシーキャッスルが正しくインストールされていない場合、これはを含むさまざまな例外を除いて失敗します。キーストアがBouncyCastleプロバイダーで作成されていない場合、例外が発生し、次のケースで混乱が生じる可能性があります。-storetype bkskeytool
    java.security.KeyStoreException: BKS not foundjava.io.IOException: Wrong version of key store.

  3. バウンシーキャッスルプロバイダーの適切なバージョン(1、2、3)を使用する必要があります。ほとんどの場合、これはバージョン1.46のようです。 これは、JREのフォルダーに入れて、クラス名をに追加するか、コマンドラインで直接指定することができます。互換性のないバージョン(またはストアタイプ)の場合は、再びの行に沿って例外が発生します。
    lib/ext/lib/security/java.securitykeytooljava.io.IOException: Wrong version of key store.

  4. すべての仲介者とルート証明書を含める必要があります。不足しているものがある場合は、javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.例外が発生します。

  5. それらが正しく検証されるためには、証明書チェーンが必要です。そうでない場合は、取得するかjavax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: IssuerName(CN=XYZ) does not match SubjectName(CN=ABC) of signing certificate.、もう一度取得するか、一般的なjavax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 私はキーストアでそれらを注文する方法を見つけられなかったので、実行時にコードでそれを行うことに頼りました。

7文字より長いキーストアパスワードを使用すると失敗することもあると示唆する人もいますが、それは私が見つけたものではありません。

これは私が見つけたすべての落とし穴をカバーしていると思いますが、関連する質問に自由に拡張してlinskを追加してください。

于 2013-01-03T00:22:29.570 に答える
2

Bouncy Castle 1.47 は異なるバージョンのヘッダーを使用しています。バージョン 1.46を試してみてください。動作するはずです。

keytool -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -storepass osmosm -keystore C:/keystore -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-ext-jdk15on-1.46.jar
于 2013-01-02T03:11:26.290 に答える