1

我对 SSL 证书有疑问。我正在使用 1.46 的 BouncyCastle,这已被证明对 3.1 是成功的。和我测试过的 4.0 硬件。但是它在 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: 没有对等证书

我的目标硬件有 2.3.5 Android,并且应该还包含 1.45 版本的 BouncyCastle。如果我使用 1.45 生成 BC 证书并将其部署在我的 2.3.5 硬件上,那么应该正确处理它并为我提供 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 回答