Public 移动应用程序中的密钥固定与证书固定

Public key pinning vs Certificate Pinning in mobile apps

场景:

我的理解(如果我在这里有错误,请纠正我):

问题:

请帮助我尽可能详细地理解这一点...

When the Leaf cert has expired but is corresponding to the valid "pinned" public key SHA, the chain of certificates is checked to see if they are valid and if one of them is valid , the certificate is accepted and the connection is established.

没有。不接受过期的证书。固定不会覆盖 TLS 的基本原则,但会增强它以减少接受的证书数量。

Does public key pinning in any way help in security , if an attacker compromises a client and installs his own trusted CA and then does an MITM on the client to intercept all communication by presenting his own forged certificate signed by the CA he has installed on the client device.

对于浏览器,手动安装的可信 CA 不受固定要求的约束。对我来说,这是固定的一个根本缺陷。老实说,一旦您有权在机器上安装根证书,游戏就结束了。无论如何,这个例外是允许病毒扫描器、公司代理和其他拦截代理工作所必需的——否则任何固定的站点在这些代理之一之后都无法访问,尽管它确实削弱了 HPKP(HTTP Public Key Pining)我的想法。

对于应用程序(您的用例)固定可用于防止 MITM 攻击。

How does direct certificate pinning VS public key pinning make a difference here in any way ?

不明白?当您固定直接证书时,您基本上固定了该证书的 public 密钥(实际上,该证书也链接了私钥的 SHA)。

这意味着您可以使用相同的私钥重新颁发证书(恕我直言,这是一种不好的做法),而不必更新密码。

您还可以从中间甚至根 public 密钥固定。这意味着您可以让您的 CA 重新颁发证书,而不必再次更新 pin。这当然会将您绑定到该 CA,但至少不允许某些随机 CA 为您的站点颁发证书。

What is the implication of using a self-signed certificate in the above questions.

对于浏览器,固定基本上不能与自签名证书一起使用。因为它要么不被浏览器识别(因此固定将不起作用),要么它是通过手动安装发行者来信任的 - 此时按上述点忽略固定。

对于应用程序(同样是您的用例),我知道可以固定自签名证书。尽管这取决于您使用哪个 HTTP 库以及如何配置它。

固定证书本身的缺点之一(如果它是单个泄漏的自签名证书,这可能是唯一的方法),重新颁发证书会使旧的固定无效(除非您重新使用相同的私钥,但如果重新发布的原因是由于密钥泄露,则这可能是不可能的)。因此,如果您的应用发出 HTTP 呼叫主页以检查是否有新版本等,那么如果重新颁发证书并且尚未下载新版本的应用,则该呼叫可能会失败。

几乎所有浏览器都弃用了 HPKP,因为与收益相比,它的风险非常高,并且有许多因固定而导致损坏的案例。请参阅维基百科:https://en.m.wikipedia.org/wiki/HTTP_Public_Key_Pinning. Monitoring for mis-issued certificates through Certificate Transparency 被视为更安全的选择。

固定在移动应用程序中似乎仍然有些流行 space 因为您可以更好地控制应用程序并且可以在出现问题时重新发布新版本。但还是比较复杂和有风险。

我的回答背景

Scenario :

I have pinned public key pin SHAs of 3 certificates : Root CA , Intermediate CA and Leaf CA in my android application.

我的答案是在固定移动应用程序的上下文中。无论如何,新浏览器不再支持固定。

固定和安全

Does public key pinning in any way help in security

它有很大帮助,因为您的移动应用程序仅与服务器通信,该服务器提供带有匹配 pin 的证书。例如,如果您执行 public 密钥固定并在后端轮换证书,同时使用不同的 private/public 密钥对签名,那么您的移动应用程序将拒绝连接到您自己的服务器,直到您发布一个带有新引脚的新版移动应用程序。

MitM 攻击和 Pinning

if an attacker compromises a client and installs his own trusted CA and then does an MITM on the client to intercept all communication by presenting his own forged certificate signed by the CA he has installed on the client device.

当您固定连接时,攻击者将不会成功,因为这是固定连接的设计目的,以防止操纵设备上的证书信任库以进行 MitM 攻击。来自 Android API 24 个用户提供的证书在默认情况下不受信任,除非开发人员通过 network security config file:

选择信任它们
<base-config cleartextTrafficPermitted="false">
    <trust-anchors>
        <!-- THE DEFAULT BEHAVIOUR -->
        <certificates src="system" />

        <!-- DEVELOPER ENABLES TRUST IN USER PROVIDED CERTIFICATES -->
        <certificates src="user" />
    </trust-anchors>
</base-config>

您可以阅读我写的文章以了解固定操作和不允许 MitM 攻击成功:

In order to demonstrate how to use certificate pinning for protecting the https traffic between your mobile app and your API server, we will use the same Currency Converter Demo mobile app that I used in the previous article.

In this article we will learn what certificate pinning is, when to use it, how to implement it in an Android app, and how it can prevent a MitM attack.

在文章中我详细介绍了如何实现固定,但现在我推荐使用 Mobile Certificate Pinning Generator online tool, that will generate the correct network security config file to add to your Android app. For more details on how to use this tool I recommend you to read the section Preventing MitM Attacks in 我给了另一个问题,您将在其中学习如何实现静态证书固定以及如何绕过它:

The easiest and quick way you can go about implementing static certificate pinning in a mobile app is by using the [Mobile Certificate Pinning Generator](Mobile Certificate Pinning Generator) that accepts a list of domains you want to pin against and generates for you the correct certificate pinning configurations to use on Android and iOS.

Give it a list of domains to pin:

And the tool generates for you the Android configuration:

The tool even as instructions how to go about adding the configurations to your mobile app, that you can find below the certificate pinning configuration box. They also provide an hands on example Pin Test App for Android and for iOS that are a step by step tutorial.

每次使用相同的 private/public 密钥对更新证书时,这种方法不需要发布新的移动应用程序。

证书固定与Public密钥固定

How does direct certificate pinning VS public key pinning make a difference here in any way ?

当使用证书固定时,需要发布新的移动应用程序,并且每次轮换服务器证书时用户都必须更新,而使用 public 密钥固定则不需要这样做,除非 private/public用于签署证书更改的密钥对。例如,如果您的服务器使用 LetsEncrypt 作为证书,则您无需在每次续订时都发布新的移动应用程序版本。

自签名证书

What is the implication of using a self signed certificate in the above questions.

您需要通过 Android OS 的网络安全配置文件选择加入,以信任用户提供的证书并指示用户将其添加到他的移动设备。如果不使用固定,这将使攻击者的生活更轻松。我建议您不要使用自签名证书。