6

我正在开发一个从不同服务器(http 和 https)检索图像的项目。

我发现这个有用的 Q/A可以避免No peer certificate errorAndroid 2.3 中的问题,但我不明白为什么在 Android 4 (>3) 中这个问题 (" No peer certificate error") 没有出现。

如果我错了,请纠正我:

  • 在 Android 2.3 中,HTTPS 连接执行整个证书检查(和握手);
  • 在 Android > 3 中,即使握手失败,也会建立 HTTPS 连接(例如:我的应用程序,作为对等方,没有证书)。

这些版本的Android有什么区别?为什么我需要全部信任Android 2.3 而不是 Android 4?

为什么在 Android 2.3 中我收到以下异常:"javax.net.ssl.SSLPeerUnverifiedException: No peer certificate error" 而在 Android 4 中一切正常并且已建立连接?

是否与Android Honeycomb中引入的SNI Server Name Indication相关的所有内容?

4

1 回答 1

2

您的认证机构可能不在2.3.3版本的Android中,而是在4.x版本中。要确定检查两台设备上的密钥库。

从命令行使用 ADB,您可以将 android 的密钥库转储到文件中,并检查该颁发者是否在您的密钥库中可用(可能需要是 root)。adb pull /system/etc/security/cacerts.bks cacerts.bks

下载并安装 Portecle(来自:http ://portecle.sourceforge.net/ ) 选择 File / Open Keystore... 并选择 cacerts.bks 文件。选择工具/密钥库报告并将该信息复制到文本编辑器中,以查找从 Web 浏览器中找到的证书中指定的 CN。就我而言,我无法从“Cyber​​trust Public SureServer SV CA”中找到一个。

在您的计算机网络浏览器上使用https://example.website.com/浏览到您感兴趣的网站,并找出 CN 是谁。将其与如上所示的密钥库进行比较。如果它不在密钥库中,则需要添加它。

注意:Android 4.0 手机有不同的证书存储方法,不要使用下面提到的 cacerts.bks 文件。对于他们,您应该能够在 Web 浏览器中打开所需的 https 站点并以这种方式添加所需的证书。

我遇到了与 facebook 和 redbox 的连接问题。为了解决我的问题并更新我的 android 2.3.3 手机证书,我从 android 3.2 模拟器复制了一个并将其放在我的手机上:

  1. 创建并启动一个 android 3.2 虚拟设备。
  2. 从模拟器复制 cacerts.bks 文件(确保您的其他设备未连接)。adb pull /system/etc/security/cacerts.bks cacerts.bks
  3. 断开模拟器。
  4. 连接要更新的设备(必须是 root)。您可能需要将 /system 文件夹重新挂载为 rw 以获得读/写功能。有关安装问题,请参阅:此链接
  5. 从您的设备保存旧证书文件的副本: adb pull /system/etc/security/cacerts.bks cacerts.bks.old
  6. 将更新的证书文件放在您的设备上 adb push cacerts.bks /system/etc/security/
  7. 重启设备
  8. 重新连接并验证新的 cacert 文件是否已加载。
于 2013-03-04T21:42:50.257 回答