3

我正在尝试使用内置浏览器从 Android 2.3.4 访问受 SSL 保护的 Web 应用程序。

服务器证书是我使用MAKECERT创建并安装在服务器上的自签名证书。当我尝试访问该页面时,我从浏览器中收到一条错误消息,指出The name of the site does not match name on the certificate.

我已经验证并且服务器地址与我的证书的公用名完全匹配(它实际上只是一个 IP 地址)。

当我尝试在 Android 设备上访问使用非自签名证书保护的其他网站时,不会弹出该消息。

如果我在桌面上使用 IE 或 Chrome 访问同一页面 - 除了签名授权消息之外 - 我不会收到任何警告,并且一旦我在受信任的根 CA 中安装了证书,浏览器就会顺利接受该证书。

我是否应该认为该消息实际上是 Android 拒绝自签名证书?

对此我有点疑惑。

我尝试在凭据存储中安装证书,但这并没有改善这种情况。现在我不知道接下来我会尝试什么。

问题是:在创建 Android 可接受的自签名证书时,我应该遵循什么特别的事情吗?有没有人设法在没有此警告的情况下获得 Android 接受的自签名证书?

我还能尝试什么?

-更新-布鲁诺 的回复将我引向了正确的方向,因此我设法向前迈出了一步:我重新制作了添加 SAN 的证书(不得不放弃MAKECERTOpenSSL按照安迪·阿里斯门迪的指示)。

现在消息已经消失,但我在此 SO 帖子中已经讨论过的“认证权威不受信任”问题中被阻止,所以我仍在努力寻找我的问题的最终解决方案 - Android 浏览器上没有弹出任何警告。

4

3 回答 3

4

我已经验证并且服务器地址与我的证书的公用名完全匹配(它实际上只是一个 IP 地址)。

Android 的主机名验证器比某些浏览器更严格地符合RFC 2818 。根据规范,如果使用 IP 地址,它必须在IP 地址类型的 Subject Alternative Name 条目中:而不是 DNS 类型的 SAN 条目或 CN:

如果存在 dNSName 类型的 subjectAltName 扩展,则必须将其用作身份。否则,必须使用证书主题字段中的(最具体的)通用名称字段。尽管使用通用名称是现有的做法,但它已被弃用,并且鼓励证书颁发机构使用 dNSName 代替。

[...]

在某些情况下,URI 被指定为 IP 地址而不是主机名。在这种情况下,iPAddress subjectAltName 必须出现在证书中,并且必须与 URI 中的 IP 完全匹配。

最简单的方法是使用主机名。(在证书中使用 IP 地址永远不会真正实用。)或者,生成带有 SAN IP 地址条目的证书。(您可能对此感兴趣。)

于 2012-05-28T09:41:16.417 回答
1

首先,Android 2.x 上的凭证存储仅用于 VPN 和 WiFi 应用程序,浏览器看不到它。您不能在受信任的证书存储中安装自己的证书(除非您有根设备)。

您是我们在公共 IP 地址上的网络应用程序还是您通过 WiFi 访问的本地网络应用程序?您可能想查看 logcat 输出,可能有一些警告会在那里给您提示。还可以尝试从其他设备和/或模拟器(如果可能的话,使用不同的 Android 版本)并比较消息/行为。

于 2012-05-28T08:52:48.970 回答
0

所以我仍在努力为我的问题找到最终解决方案 - Android 浏览器上没有弹出任何警告

Nikolay Elenkov 告诉您为什么不能将证书保存到 Android 上的受信任存储中。这种情况最近发生了变化,但对较旧的 Android 客户端没有帮助。有关 Android 的 Keychain 和 Keystore 的简要历史,请参阅Android 上是否有任何系统证书存储?(它指的是尼古拉的两个帖子)。

因为您在 Android 浏览器中工作,所以您需要使用 Android 商店中已有的 CA。要从已受信任的 CA 获取服务器证书,请尝试StartCom。StartCom 提供免费的 1 类证书,并且它们的根在大多数移动和桌面浏览器中都受到信任。(请记住,如果需要,他们会收取撤销费用)。

为了完整起见,如果您自己编写了客户端,那么您将提供自定义X509TrustManager并覆盖checkServerTrusted以接受您的证书。它不需要与 Keystore、Keychain 或外部 CA 进行任何交互。但是您没有该选项,因为您没有编写浏览器。

于 2014-02-20T14:52:35.467 回答