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

Posted

技术标签:

【中文标题】使用 Microsoft Azure SDK 在 iOS 中固定 SSL 证书【英文标题】:SSL Certificate Pinning in iOS with Microsoft Azure SDK 【发布时间】:2017-08-01 15:36:34 【问题描述】:

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

我正在编写一个利用适用于 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 运行的,我的应用会知道阻止请求吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

现在,我们来谈谈公钥固定和通配符证书的密钥连续性。

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

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

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

【讨论】:

那么,如果我通过 OWASP 描述的方法正确检查了 Microsoft 的公钥,我可以认为我的应用已针对 MitM 攻击进行了强化? 我已经更新了我的答案,我不知道你是否在写评论之前阅读了新版本。无论如何,我认为您应该在我的回答中考虑第三种情况:如果您的应用程序看到 abc.azurewebsites.net 的证书,您的应用程序将不会查看固定密钥,因为固定密钥只能与以前看到的证书相关联。因此,如果您只实施 OWASP 解释的内容,您将不会受到可能为 abc.azurewebsites.net 颁发真实证书的人的保护。为了防止此类攻击者,您必须在看到此类证书时停止请求。 我确实阅读了您的答案(在编辑过程中多次阅读;大声笑)。关于#3,如果有人确实获得了该域的证书(他们不应该,对,因为微软拥有它?),证书检查不会仍然失败,因为证书数据与固定的证书数据不匹配? 微软拥有该域,但如果有人入侵了证书颁发机构,而不是微软使用的证书颁发机构,他可以为该域颁发证书。因此,在不入侵 Microsoft 的情况下,可以为该域颁发证书。例如,请参阅slate.com/articles/technology/future_tense/2016/12/…。 好的,现在我正在检查服务器证书和本地固定的证书,并检查服务器证书的 url 是否为*.azurewebsites.net。这涵盖了我所有的基础吗?但是我仍然没有看到有人颁发另一个(有效)证书是一个问题。它不会通过证书比较,只要我的原始(固定)证书真的来自微软,对吧?还是我错过了什么?

以上是关于使用 Microsoft Azure SDK 在 iOS 中固定 SSL 证书的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure SDK for .NET 获取 Azure 资源 SKU

Azure Function v2 引用了 Newtonsoft.Json 版本高于 Microsoft.NET.Sdk.Functions 的项目

IIS 托管的 Azure Bot 通道注册 Microsoft Bot Framework sdk 聊天机器人不起作用

Microsoft.NET.Sdk.CrossTargeting.targets 上的 Visual Studio Build in Azure DevOps 管道错误

Microsoft Azure Service Fabric SDK - 预览 1 fais 安装在 win 7 + VS 2015RC

Azure 函数 SDK 导致 Newtonsoft 问题