使用 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 证书的主要内容,如果未能解决你的问题,请参考以下文章