1

SSL 証明書に問題があります。私は BouncyCastle 1.46 を使用していますが、これは 3.1 で成功することが証明されています。私がテストした4.0 HW。ただし、2.3.5 では失敗します。

Android ドキュメントを確認したところ、BC の 1.46 は 3.1 と 4.04 で成功し、1.45 は 2.3.5 でうまくいくはずです。

しかし、そうではありません。BKS データ mystore_gb が bcprov-jdk15-145.jar を使用して生成された以下のコード スニペットを試しました (これで jdk13-16 バリアントを試しました)。

KeyStore trusted = KeyStore.getInstance("BKS");
InputStream in;
if (Build.VERSION.SDK_INT<11) {
  in = context.getResources().openRawResource(R.raw.mystore_gb);
} else {
  in = context.getResources().openRawResource(R.raw.mystore);
}

try {
  trusted.load(in, PWD.toCharArray());
} finally {
  in.close();
}

私が生成するために使用するスクリプトは、次のように OK 情報をもたらしたようです:

#!/bin/bash

echo | openssl s_client -connect $1:443 2>&1 | \
 sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > mycert.pem


export CLASSPATH=bcprov-jdk15-145.jar
CERTSTORE=res/raw/mystore_gb.bks
if [ -a $CERTSTORE ]; then
    rm $CERTSTORE || exit 1
fi
keytool \
      -importcert \
      -v \
      -trustcacerts \
      -alias 0 \
      -file mycert.pem \
      -keystore $CERTSTORE \
      -storetype BKS \
      -provider org.bouncycastle.jce.provider.BouncyCastleProvider \
      -providerpath ./ \
      -storepass $2

では、なぜこれが機能しないのでしょうか。私は得る

09-06 21:51:36.397: D/ServerBase(26999): javax.net.ssl.SSLPeerUnverifiedException: ピア証明書がありません

私のターゲット HW は 2.3.5 Android で、ver 1.45 の BouncyCastle も収容する必要があります。1.45 を使用して BC 証明書を生成し、それを 2.3.5 HW に展開すると、適切に処理され、SSL 接続が提供されるはずです。

ここで何が欠けていますか?

4

1 に答える 1

1

SSLPeerUnverifiedException証明書の検証の問題ではなく、サーバーが証明書を送信しなかったという事実の問題です。これがBouncyCastleのバージョンと大いに関係があるとは思えません。

結果が有効なX.509である限り、証明書を生成する対象は、これとは何の関係もありません。ここでは、最初の接続で取得したサーバー証明書を参照として、既存の証明書をインポートしているように見えます。

ここで発生する例外は、選択した暗号スイートやSSL/TLSバージョンの問題が原因である可能性があります。(SSLv3にダウングレードすることをお勧めしていませんが、コメントを含めてこの質問を見ることができます)。

さまざまな暗号スイートやSSL/TLSバージョンを試してみることができますopenssl s_client(たとえば、-cipherオプションまたはの組み合わせ-ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1、のドキュメントを確認してくださいs_client)。これの一部は、サーバー構成が正しくないことが原因である可能性もあります。

于 2012-09-06T20:47:52.080 に答える