这不是一般的证书固定问题。
我正在编写一个使用适用于 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/