【问题标题】:BouncyCastle version and SSL certificate acceptanceBouncyCastle 版本和 SSL 证书接受
【发布时间】:2012-09-06 20:20:33
【问题描述】:

我的 SSL 证书有问题。我正在使用 1.46 的 BouncyCastle,这在 3.1 中已被证明是成功的。和我测试过的 4.0 硬件。但是它在 2.3.5 上失败了。

我检查了 android 文档,并注意到,虽然 BC 的 1.46 对 3.1 和 4.04 是成功的,但 1.45 应该对 2.3.5 有效。

但事实并非如此。我已经尝试了下面的代码 sn-p,其中 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 info,看起来像:

#!/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 连接。

我在这里错过了什么?

【问题讨论】:

    标签: android ssl bouncycastle


    【解决方案1】:

    SSLPeerUnverifiedException 不是证书验证的问题,而是服务器没有发送证书的问题。我怀疑这与 BouncyCastle 的版本有很大关系。

    只要结果是有效的 X.509,您生成证书所用的内容就与此无关。在这里,您似乎只是在导入现有证书,并以您在初始连接时获得的服务器证书作为参考。

    您在这里遇到的异常很可能是由于所选密码套件和/或 SSL/TLS 版本存在问题。 (你可以看看this question, including comments,虽然我不建议你降级到 SSLv3)。

    您可以尝试使用 openssl s_client 的各种密码套件和/或 SSL/TLS 版本(例如 -cipher 选项或 -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1 的组合,请查看 s_client 的文档)。其中一些可能是由于服务器配置不正确造成的。

    【讨论】:

    • 我已经检查了命令 openssl s_client -tls1 -showcerts -connect :443 和 ssl3 类似,我得到了两个证书链和一个 err "verify error:num=19:self证书链中的签名证书”在这两种情况下,我猜一种是自签名证书。服务器同时使用 TLSv1 和 SSL3。
    • 但我认为您的建议值得遵循并进行更多挖掘。现在意识到我得到的错误是:Catch exception while startHandshake: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certificate path not found。使用 SSL_NULL_WITH_NULL_NULL 的无效密码套件返回无效会话。
    • 尝试了很多东西,都没有奏效。我将服务器设置为 SSLProtocol all -SSLv2 和 SSLCipherSuite ALL。还是没有骰子。 openssl s_client 命令返回 TLS 和 SSL 的证书,尽管有错误表明它们是自签名的。我试图按照链接页面中的信息中的建议强制使用 SSLv3。我试图在应用程序中强制选择一定数量的密码套件。没有任何效果。哦,我让 checkServerTrusted() 不采取行动就返回了。在那种情况下建立了联系(花了很长时间)。它与 SSLv3 一起使用,具有 RC4-SHA 密码。只有一次成功。不安全。
    • 好的,深入挖掘,我可以看到我的证书已加载,但 checkServerTrusted() 似乎拒绝了我的自签名 CA。 “NativeCrypto”返回错误代码 2(结果 1)。我得出结论,区别不在于密码套件或服务器设置。这与它是一个自签名证书的事实有关,并且 2.3.x 不容易被哄骗到后续套件中。如果有人能说服我,我会很高兴...我将不得不默认为 GB 使用不安全的作案方式,并将我的原始解决方案保留为 3.0 及更高版本。谢谢布鲁诺,你是对的。这里的 BouncyShadow 没有阴影。
    • 终于满意了。答案本身并没有解决我的问题,但仍然让我专注于其他问题,所以我最终可以找到一个可行的解决方案。 (不是很好,但还可以)。我对 3.0 之前的版本使用不安全的 TrustManager。但截至目前,这些数据并不具有关键性质(主要是游戏统计数据)。所以:谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2016-02-07
    • 2016-06-05
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    相关资源
    最近更新 更多