1

我将自签名证书用于开发和测试目的。我研究了各种方法让 android 模拟器接受自签名证书。到目前为止,我发现了以下方法的变体:

  1. 提供您自己的将接受任何证书的安全类。
  2. 为您的应用创建一个包含自签名公钥的密钥库。
  3. 将属性 socket.relaxsslcheck 设置为 yes。

前两个选项非常复杂,并在您的代码中引入了对您的环境的依赖,例如开发、测试或生产。

选项 3 我喜欢,因为环境配置驱动行为,与将配置的数据源提供给在容器中运行的应用程序的 Web 容器不同。开发环境将指向开发数据源等。不幸的是,我正在努力让它工作。我尝试了以下方法:

  • 使用 adb 设置属性

    adb shell setprop socket.relaxsslcheck yes

  • 使用 System.setProperty

    System.setProperty("socket.relaxsslcheck","yes")

  • 试图改变 /system/build.prop 和 default.prop

第一个选项会被忽略。根据我的阅读,似乎设置该属性将在重新启动后生效。但是该属性似乎是不稳定的,它无法在模拟器重新启动后继续存在。

System.setProperty(...)由于工厂已经创建,这种方法似乎为时已晚。由于上述问题(代码中的开发环境特定代码),除非别无选择,否则我宁愿不走这条路。

最后一个选项应该在模拟器重启后仍然存在,但即使在运行adb root.

我是 Android 开发新手,希望能提供一些关于最佳方法以及如何使其发挥作用的指导。

4

1 回答 1

1

好吧,您必须使用该选项准确指定“是”,即:

-prop socket.relaxsslcheck=yes

源代码只是将属性值与'yes'进行比较(并且不费心也测试与'true'或'1'等等效值......)

使用 ADT 捆绑包,我通过以下方式设置该选项

Run -> Debug Configurations... -> Android Application -> ProjectName -> Target
  -> Additional Emulator Command Line Options

仿真器重新启动后,SSLSocketCertificateFactory在广告中工作,即它接受所有证书。可以通过查看日志来验证:

12-08 18:10:52.382: W/SSLCertificateSocketFactory(763): 
  *** BYPASSING SSL SECURITY CHECKS (socket.relaxsslcheck=yes) ***

我使用自行创建的证书对其进行了测试 - 没有该属性集连接失败并出现证书验证错误,使用该属性集(或使用SSLCertificateSocketFactory.getInsecure())TLS 套接字连接得很好。

顺便说一句,SSLSocketCertificateFactory有时使用起来似乎很棘手——例如,我正在努力从那个工厂获取一个实际实例——人们发布的解决方法基本上是说:忽略那个工厂。谷歌搜索一些人甚至建议完全不要使用该工厂 - 但没有给出太多理由。

于 2012-12-08T18:34:41.007 回答