我正在尝试使用https连接到服务器,当我这样做时说连接需要客户端证书。如果我按是继续,我将收到TLSAlertException 连接代码类似于:
SecureConnection con = (SecureConnection)Connector.open("ssl://url:443");
我查看了模拟器(以及设备上)的证书,默认情况下没有任何客户端(个人)证书。我已经尝试通过代码生成一个,但我不知道如何让它显示在手机上的个人证书下。
我找到了this,但在设备上获取个人证书时,没有一个选项是非常可取的。
那么,是否有可能在模拟器上获得个人证书,理想情况是通过代码? 如果我能够获得一个,SecureConnection在连接到服务器时会自动使用它吗? 如果不存在那些可以使这项工作的图书馆吗?
答案 0 :(得分:1)
因此,在进行了一些挖掘之后,我找到了Bouncy Castle TLS API。长话短说,它似乎到目前为止工作,但我将列出我经历的步骤,因为我沿途遇到了一些障碍。
您可以从http://www.bouncycastle.org/latest_releases.html下载类文件的源代码和拉链。在“Sources and Javadoc”部分下有J2ME的链接。
首先,我尝试将cldc_classes.zip作为外部JAR添加到构建路径中。现在,Eclipse中的充气城堡代码的代码完成了。所以我启动了模拟器,但是当我尝试启动应用程序时,它给了我“启动应用程序时出错:未找到模块'cldc_classes.zip'。”我四处搜索并发现问题是我需要选中Build Path设置的“Order and Export”选项卡上的框。糟糕!
所以我检查了它并尝试再次运行,但在模拟器启动之前得到了“错误:预验证失败”。一些更多的搜索显示我必须预先验证zip文件以使其工作,这似乎很容易。
使用preverify工具提供了许多错误和警告,看起来它们与java包中的类的重复创建有关。在Bouncy Castle常见问题解答中,他们提到了类似的内容,并建议对代码进行模糊处理。
我发现了一个java混淆器,经过一些小小的混乱之后能够对这些类进行混淆。试图预先验证并再次失败...我不想学习更多关于预先验证的知识,所以我决定只导入源文件。
其中一个软件包依赖于ArrayList有错误,但它似乎没有必要,我只是删除了它。试图运行它有一个关于“重复属性不匹配:'MIDlet-name'”的错误。其中一个包中有一个.jad文件,我将其删除以消除错误。也可以删除测试包而不会产生任何后果。
尝试现在运行我得到了“Eclipse I / O错误:无法运行程序”jar“:CreateProcess error = 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();