1

我正在尝试使用 https 连接到服务器,当我这样做时,它说连接需要客户端证书。如果我按是继续,我会得到一个 TLSAlertException。
连接代码如下所示:

SecureConnection con = (SecureConnection)Connector.open("ssl://url:443");

我查看了模拟器(以及设备)上的证书,默认情况下没有任何客户端(个人)证书。我试过通过代码生成一个,但我不知道如何让它显示在手机上的个人证书下。

我发现了这一点,但没有一个选项非常适合在设备上获得个人证书。

那么,是否有可能在模拟器上获得个人证书,最好是通过代码?
如果我能得到一个,SecureConnection 会在连接到服务器时自动使用它吗?
如果没有,那里有可以使这项工作的图书馆吗?

4

1 回答 1

1

因此,在进行了更多挖掘之后,我发现了Bouncy Castle TLS API。长话短说,到目前为止它似乎一直在工作,但我将列出我经历的步骤,因为我在此过程中遇到了一些障碍。

您可以从http://www.bouncycastle.org/latest_releases.html下载源代码以及类文件的 zip 。在“Sources and Javadoc”部分下,有 J2ME 的链接。

首先,我尝试将 cldc_classes.zip 作为外部 JAR 添加到构建路径。充气城堡代码的代码完成现在在 Eclipse 中工作。所以我启动了模拟器,但是当我尝试启动应用程序时,它给了我“错误启动应用程序:找不到模块'cldc_classes.zip'。” 我四处搜索,发现问题是我需要选中“构建路径”设置的“订单和导出”选项卡上的复选框。哎呀!

所以我检查了它并尝试再次运行,但在模拟器启动之前得到“错误:preverifier failed”。更多搜索显示我必须预先验证 zip 文件才能使其工作,这似乎很容易。

使用 preverify 工具会产生很多错误和警告,看起来它们与在 java 包中重复创建类有关。在 Bouncy Castle 常见问题解答中,他们提到了类似的内容并建议混淆代码。

我找到了一个 java 混淆器,经过一番摆弄之后,我就可以混淆这些类了。尝试进行预验证,但又失败了……我不想了解更多关于预验证的知识,所以我决定只导入源文件。

其中一个包在依赖 ArrayList 时出现错误,但似乎没有必要,我只是将其删除。尝试运行它时出现关于“重复属性不匹配:'MIDlet-name'”的错误。在其中一个包中有一个 .jad 文件,我删除了该文件以消除错误。测试包也可以被删除而不会产生任何后果。

现在尝试运行时出现“Eclipse I/O 错误:无法运行程序“jar”:CreateProcess 错误 = 2”。一些搜索显示我需要将 java jdk bin 文件夹(类似于 C:\Program Files\Java\jdk\bin)添加到 PATH 环境变量中。

最后我能够运行并且能够成功连接、发送和接收数据。在项目中使用充气城堡罐可能有更好/更简单的方法,现在我知道代码确实有效,我可能会考虑这样做。下面是连接的一些示例代码。

SocketConnection con = (SocketConnection)Connector.open("socket://url:443");
TlsProtocolHandler tph = new TlsProtocolHandler(con.openInputStream(), con.openOutputStream());
tph.connect(new AlwaysValidVerifier());
is = tph.getInputStream();
os = tph.getOutputStream();
于 2012-01-12T02:28:13.227 回答