2012-09-06 124 views
0

我有一个SSL证书有问题。我正在使用1.46的BouncyCastle,并且已经证明3.1的成功。和4.0我测试过的硬件。但它在2.3.5上失败。BouncyCastle版本和SSL证书验收

我已经检查了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(); 
} 

我用它来生成脚本似乎导致好的信息,看起来像:

#!/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拥有的Android 2.3.5,并应容纳版本1.45的BouncyCastle。如果我使用1.45生成BC证书并将其部署在我的2.3.5 HW上,那么应该正确处理它并给我SSL连接。

我在这里错过了什么?

回答

0

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

只要结果是有效的X.509,你生成你的证书的任何内容都不应该与这些有关。在这里,您似乎正在导入现有的证书,将您在初始连接上获得的服务器证书作为参考。

你得到的例外很可能是由于选定的密码套件和/或SSL/TLS版本的问题。 (你可以看看this question, including comments,虽然我不建议你应该降级到SSLv3)。

你可以尝试不同的密码套件和/或SSL/TLS版本,openssl s_client(的-ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1例如-cipher选择或组合,检查文档s_client)。其中一些可能是由于服务器配置不正确。

+0

我已经检查过命令openssl s_client -tls1 -showcerts -connect :443和类似的ssl3,我得到一个两个证书链和一个err“verify error:num = 19:证书链中的自签名证书”这两种情况下,我想一个自签名证书。服务器与TLSv1和SSL3都配置在一起。 – opaque

+0

但我认为你的建议值得遵循,并做一些更多的挖掘。现在意识到我得到的错误是:捕获异常,同时startHandshake:javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚点。 返回SSL_NULL_WITH_NULL_NULL无效密码套件无效的会话。 – opaque

+0

试了很多东西,都没有工作。我将服务器设置为SSLProtocol all -SSLv2和SSLCipherSuite ALL。仍然没有骰子。 openssl s_client命令返回TLS和SSL的证书,但有错误表明它们是自签名的。我试图按照链接页面中的信息所建议的方式强制使用SSLv3。我试图强制在应用程序中选择一些密码套件。没有工作。哦,我有checkServerTrusted()返回没有动作。在这种情况下有一个连接(花了很长时间)。它与力量SSLv3,有RC4-SHA密码。只有成功的时候。不安全。 – opaque