错误:Android 上自签名 SSL 证书的名称未缓存



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

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

我已经验证了,服务器地址恰好占用了我的证书的公用名(它实际上只是一个 IP 地址)。

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

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

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

我对此有点困惑。

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

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

我还能尝试什么?

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

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

我已经验证了,服务器地址正好在处理公共我的证书名称(它实际上只是一个 IP 地址)。

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

如果存在 dNSName 类型的 subjectAltName 扩展,则必须将该扩展用作标识。否则,(最具体的)常见必须使用证书的"主题"字段中的名称字段。虽然使用公用名是现有做法,但它是已弃用,并鼓励证书颁发机构使用相反。

[...]

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

最简单的方法是使用主机名。(在证书中使用 IP 地址从来都不切实际。或者,生成具有 SAN IP 地址条目的证书。(您可能对此感兴趣。

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

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

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

尼古拉·埃连科夫(Nikolay Elenkov)告诉您为什么无法将证书保存到Android上的受信任存储区。这种情况最近发生了变化,但对较旧的Android客户端没有帮助。有关 Android 钥匙串和密钥库的简要历史,请参阅 Android 上是否有任何系统证书存储?(它指的是尼古拉的两个帖子)。

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

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

最新更新