ios - 使用 Microsoft Azure SDK 在 iOS 中固定 SSL 证书

标签 ios azure ssl pinning certificate-pinning

这不是一般的证书固定问题。

我正在编写一个使用适用于 iOS 的 Microsoft Azure SDK 的 iOS 应用程序。他们没有实现证书固定,所以我下载了完整的 SDK 并正在修改它以添加我自己的固定。

我正在遵循 OWASP 给出的示例代码。它要求我在终端中执行以下代码:

$ echo "Get HTTP/1.0" | openssl s_client -showcerts -connect www.random.org:443

我已经运行了,将我的 {url}.azurewebsites.net 换成了 www.random.org。我得到了一个很好的输出,其中列出了几个证书。

根据 OWASP 代码,看来我应该使用这个代码:

Certificate chain
 0 s:/CN=*.azurewebsites.net
   i:/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT SSL SHA2

让我担心的是 CN 是通配符 *.azurewebsites.net。这是否意味着如果我使用此证书而有人试图利用另一个 Azure Web 应用程序进行中间人攻击,则该证书固定对他们来说会成功,从而无法保护我的应用程序?

例如,如果我的应用位于 abc.azurewebsites.net 并且中间人攻击是从 xyz.azurewebsites.net 运行的,那么我的应用知道要阻止请求吗?

最佳答案

在 Azure 中注册了 xyz.azurewebsites.net 的攻击者无法使用 xyz.azurewebsites.net 执行 MitM 攻击,因为他不知道私钥。只有 Azure 知道私钥的值。

所以,这并不是因为注册了 xyz.azurewebsites.net 的人能够拦截您的应用程序与 abc.azurewebsites.net 之间的通信,他可以欺骗你的应用程序。但请注意,这与证书的公钥固定无关。

首先,让我们谈谈您不拥有的证书的公钥固定。

在这种情况下,请务必小心,如果您必须管理您的服务器证书,则每次您必须要求 CA 为您颁发新证书时,您都可以重复使用相同的 key 。因此,您可以避免实现 OWASP 所称的 key 连续性(请参阅 https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning)。但是在您的情况下,Microsoft 可以在颁发新证书时使用新 key 。在这种情况下,您的应用程序将停止工作,这不是您想要的。因此,您应该在固定时实现 key 连续性。

因此,如果您只想在您的应用中简单地实现一个静态固定 key ,我认为这是危险的。 Microsoft 可以在需要时更改公钥。例如,如果他们的私钥被盗,他们将使用新的公钥生成一个新证书(并且他们将撤销之前的证书)。在这种情况下,您的应用程序将看到一个新 key ,但不应停止请求。

现在,让我们谈谈具有通配符证书 key 连续性的公钥固定。

1- 首先,假设有人成功地为 *.azurewebsites.net 颁发了真实证书。由于您的应用程序使用通配符证书的公钥固定,您的应用程序将看到该证书不包含正确的公钥。因此,您的应用将阻止该请求。

2- 现在,假设有人成功地为 xyz.azurewebsites.net 颁发了真实证书。因此,您的应用会发现证书既不是 abc.azurewebsites.net 也不是 *.azurewebsites.net。因此您的应用将停止请求。

3- 最后,假设有人成功地为 abc.azurewebsites.net 颁发了真实证书。你的应用程序将看到 abc.azurewebsites.net 的正确证书。因此,您需要在您的应用程序中编写错误代码,以使其停止请求,因为您知道 Azure 不会颁发此类证书。

关于ios - 使用 Microsoft Azure SDK 在 iOS 中固定 SSL 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45442070/

相关文章:

ios - 添加带有向上动画的部分/行

ios - UITableViewController 中的 UITextField

Azure WebApp 删除错误请求的 'Server' header

postgresql - 具有 ClusterIP 的 Pod 的 IP 与入口的静态 IP 不同

ios - 选项卡栏高度和按钮大小 - 已修复?

ios - 在 sqlite 数据库中插入批量数据时无法打开数据库文件

python - Azure 分析休息 API : 401 Unauthorized. "Authentication failed."

Ruby:NET::LDAP plus start_tls 是否支持证书验证?

c# - 使用 WebClient 时如何强制执行 SSL?

ASP.NET Core 将 http 重定向到 https,但我不想在 localhost 中执行此操作,我也使用不同的端口