有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java SSL:解析证书时出错:确定

NOTE: I ended up dropping support for Android 2.2 entirely, due to other problems... this issue remains a mistery though.


我在华为U8150上的Android 2.2中遇到SSL异常

java.io.IOException: Error parsing the certificates: Ok
  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeinit(Native Method)
  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.init(OpenSSLSocketImpl.java:125)
  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.<init>(OpenSSLSocketImpl.java:241)
  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImplWrapper.<init>(OpenSSLSocketImplWrapper.java:35)
  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl.createSocket(OpenSSLSocketFactoryImpl.java:83)
  at org.jivesoftware.smack.tcp.XMPPTCPConnection.proceedTLSReceived(XMPPTCPConnection.java:739)

我使用的代码相当简单: https://github.com/kontalk/安卓client/blob/master/app/src/main/java/org/kontalk/client/KontalkConnection.java

上面的代码只是设置一个客户端证书和一个用于身份验证的私钥。该代码在Android 2.3及更高版本上正常工作

我检查了ApacheHarmony代码以了解隐藏的内容,在解析证书链时,它似乎失败了:http://www.netmite.com/安卓/mydroid/dalvik/libcore/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/OpenSSLSocketImpl.java

在函数init()中:

ByteArrayOutputStream certificateOS = new ByteArrayOutputStream();
PEMWriter certificateWriter = new PEMWriter(new OutputStreamWriter(certificateOS));

for (int i = 0; i < certificates.length; i++) {
    certificateWriter.writeObject(certificates[i]);
}
certificateWriter.close();

它只是使用一个PEMWriter来创建一个PEM格式的连接链,将其传递给OpenSSL(通过nativeinit函数)

我的应用程序生成的证书是正版的,用openssl x509测试。我不得不说它有一个自定义扩展,但我重申,任何高于2.2的版本都可以正常工作

我已将证书上载到此处:http://paste.debian.net/209823/


更新

我一直在尝试在我的桌面上重现Android为达到问题点所做的所有步骤,即(用检查标记为我成功尝试的步骤):

  1. 将证书存储到密钥库中
  2. 从密钥库加载证书(DER格式)检查
  3. 将证书转换为PEM格式-检查
  4. 通过OpenSSL解析PEM证书-检查

对于第三步,我使用Bouncy Castle 1.49和PEMWriter,就像Android一样
对于第4步,我创建了一个与OpenSSL 0.9.8m(安卓2.2中安装的版本)链接的小型C实用程序,它执行相同的函数调用来初始化SSL上下文并从文件加载证书

现在我剩下的是:

  • 密钥库处理有问题(我怀疑这一点,尽管已知Android有一个残废/修改版的Bouncy Castle)
  • Android Java/Dalvik bug(不太可能,但仍有可能)
  • 完全排除Android 2.2(我宁愿不这样做,特别是因为这个问题也可能出现在我还没有尝试过的其他较新版本中)

代码发布在这里:https://gist.github.com/daniele-athome/47f458d64aefed6e6c11


共 (0) 个答案