因此,在进行了更多挖掘之后,我发现了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();