0

一般来说,这不是关于证书固定的问题。

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

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

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

我已经运行了它,换成了我{url}.azurewebsites.net的 for 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

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

例如,如果我的应用程序是 atabc.azurewebsites.net并且中间人攻击是从 运行的xyz.azurewebsites.net,我的应用程序会知道阻止请求吗?

4

1 回答 1

0

已在 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 不会颁发此类证书。

于 2017-08-01T19:03:18.823 回答