iOS上的应用程序必须执行HTTPS连接,根据自定义PKI的根CA验证服务器的TLS证书。
安卓似乎有最佳做法程序来处理这个问题:一个人可以在应用程序中发布CA证书,甚至可以声明地配置钉扎。
我还没有在iOS上找到类似的机制。我可以找到的所有材料都表明,TLS验证应该通过iOS,CA证书应该添加到信任存储中,因此在系统级别上是可信的。
问题1:我错过了什么吗?
问题2:如果没有,我对iOS的安全模型感到困惑。强制在系统级别信任证书不意味着比仅仅允许开发人员在应用程序中嵌入CA证书更有风险吗?我想到了一个攻击场景:如果我能够分发一个应用程序,并说服用户信任我的自定义CA证书来访问我的私有云,那么我就可以使用我的PKI来为任意域签署证书,用于MITM攻击。
发布于 2021-11-02 12:16:01
这个场景对我来说没有任何意义,我整天都在做AppSec、戊本和威胁模型,忘记了恶意用例,首先明白这里有一个需要澄清的大混乱。
在我澄清每一种情况之前,首先让我详细阐述一下我多次提到的关于TLS生态系统和存在的信任(因为使用您自己的证书会破坏信任,从而有效地使您使用TLS rouge,默认情况下不值得信任)
有一个名为“信任锚”的概念,对于TLS,有一个大的公钥签名事件,以确保可信CA证书(在设备的根信任存储区中为CA创建根CA证书)是“可信的”。
您的CA不是一个信任锚,您创建了它,这样用户就无法知道它是正确、安全地创建的,您也不会将它用于针对他们的恶意目的。
创建根CA证书的TLS的此信任锚点是公共密钥签名的授权。因此,当信任锚'authority‘生成'root CA’证书时,它们通过扩展被信任。
根CA组织正在为各种目的创建证书,它们可以为您创建用于创建其他证书的证书(您获得的证书也是CA证书)。如果您有CA证书,它是TLS生态系统的一部分并继承信任,因此对于我从您的问题中派生出来的场景来说,这是一个完美的选择,因为您可以让它的颁发者位于根信任存储区(创建CA证书的根CA证书),并使用您闪亮的新证书创建用于服务器TLS的“叶子”证书。
因为根CA证书最终出现在我们的所有设备上,所以我们信任参加公钥签名事件的人员确保我们的信任锚是可信任的。当您有一个您希望其他人信任的CA证书,并且它不是由根CA创建的,您必须通过在设备上获得它来强制它被信任(正如您已经了解到的那样,这对于iOS不起作用,但许多其他平台仍然很难做到,但这是可能的)。或者您可以在服务器上安装根CA为您创建的CA证书,并将其与服务器使用的叶子证书同时传递给客户端(大多数web服务器可以发送完整的证书链),您不需要让终端设备被迫信任CA证书(就像您自签名时所做的那样),因为它是由根CA在设备的信任存储中创建的!
最方便的方法是找到提供私有CA服务(AWS、ACM私有CA服务)的云服务(如AWS)。AWS根CA将为您创建ACM CA证书,然后为您的服务器创建叶证书。
如果您询问客户端证书是否受信任,这是一个完全不同的概念,这涉及获得CA证书(签署客户端证书),在服务器上获得CA证书,而不是iOS设备客户端信任存储。客户端证书由iOS应用程序提供给服务器,因此您必须让应用程序使用您的证书,而不是iOS本身。应用程序是客户端,一旦与应用程序一起安装,客户端证书就没有理由在iOS设备上被“信任”。
服务器验证客户端证书是值得信任的,因此服务器有一个信任存储,并且期望CA证书(签署了客户端证书)它期望CA证书在它的信任存储中。因此,如果您控制服务器,您可以安装用于签署客户端证书的CA证书,您可以在服务器的信任存储中安装该证书。有些服务器只需跳过验证客户证书信任,只需将提供的客户端证书序列号与它们信任的预期客户端证书序列列表相匹配(这不是最佳实践,而是最常见的做法)。
场景1和场景2之间唯一的重叠是客户端向服务器显示带有客户端证书的时刻,这是您所描述的时刻,但您似乎不完全确定证书安装或验证的位置。
我认为这个答案是为了帮助读者更好地理解这两个选项,如果您对任何一个场景都有更多的问题,请考虑问一个新的问题,并留下这个问题(并接受这个答案),以使其他读者更清楚。
https://security.stackexchange.com/questions/254764
复制相似问题