如何更新固定的 SSL 证书 android

How to update pinned ssl certificates android

我正在 android 应用程序中实施 SSL 固定。我已将 2 个证书(当前和备份)嵌入到应用程序中,从而在客户端固定它们。

现在,我希望有一种机制来更新这些证书,而无需在证书过期或私钥泄露的情况下推出应用程序升级。我该如何实施?

我看到的一种可能的解决方案是通过应用程序通知。我可以广播带有新证书的通知并将它们存储在客户端中。请问这个方法有什么问题或者有什么更好的方法吗?

PUBLIC 键固定

I am implementing SSL pinning in our android app. I have pinned 2 certificates (current and backup) at the client by embedding them in the app.

如果您固定 public 密钥,则每次证书在服务器中轮换时都不需要更新您的移动应用程序,一旦您使用相同的 public 密钥对其进行签名,您可以阅读文章 Hands On Mobile APi Security: Pinning Client Connections 以了解有关如何完成此操作的更多详细信息:

For networking, the Android client uses the OKHttp library. If our digital certificate is signed by a CA recognized by Android, the default trust manager can be used to validate the certificate. To pin the connection it is enough to add the host name and a hash of the certificate’s public key to the client builder(). See this OKHttp recipe for an example. All certificates with the same host name and public key will match the hash, so techniques such as certificate rotation can be employed without requiring client updates. Multiple host name - public key tuples can also be added to the client builder().

对于用于签署证书的私钥被泄露的情况,您将end-up遇到与您现在尝试解决的相同情况,即需要发布新的移动应用程序进行更新您信任的东西。换句话说,public 密钥不再受信任,因此服务器必须使用您在移动应用程序中发布的备份 public 密钥签名的证书轮换证书。这种方法会让您有时间发布新版本,删除用于签署受损证书的 public 密钥,而不会锁定所有用户。

您应该始终将备份私钥存储在不同的地方,这样如果一个被泄露,您就不会一次全部被泄露,因为这样一来,与移动应用程序一起发布的备用 PIN 码就没有用了。

不要这样做

Now, I want to have a mechanism in place to update these certificates without requiring to roll out an app upgrade in case certificates are expired or private key is compromised. How can I implement that?

不幸的是,处理私钥泄露的更安全方法是发布一个不再信任它的新移动应用程序。您为更新证书而设计的任何远程解决方案都会为攻击者打开移动应用程序之门,以替换您固定的证书。

所以我的建议是不要走这条路,因为你会比想象中更容易搬起石头砸自己的脚。

One possible solution I am seeing is through app notification. I can broadcast a notification with new certificates and store them in the client. Is there any problem in this approach or is there any better approach?

虽然移动应用程序固定了连接,但可以绕过它,因此可以执行 MitM 攻击,并从攻击者的服务器而不是您的服务器检索新证书。请阅读文章 The Problem with Pinning 以获得更多关于绕过它的见解:

Unpinning works by hooking, or intercepting, function calls in the app as it runs. Once intercepted the hooking framework can alter the values passed to or from the function. When you use an HTTP library to implement pinning, the functions called by the library are well known so people have written modules which specifically hook these checking functions so they always pass regardless of the actual certificates used in the TLS handshake. Similar approaches exist for iOS too.

虽然证书固定可以被绕过,但仍然强烈建议使用它,因为安全是关于防御层的,你拥有的越多就越难克服所有这些......这不是什么新鲜事,如果你想到中世纪的城堡,它们就是用这种方法建造的。

可能更好的方法

但是你也要求更好的方法:

Is there any problem in this approach or is there any better approach?

如前所述,您应该锁定证书的 public 密钥,以避免在轮换服务器证书时锁定客户端。

虽然我无法为您提供更好的方法来处理泄露的私钥,但我可以指出,为了保护证书固定不被 xPosed 或 Frida 等自省框架绕过,我们可以采用移动应用证明技术,这将证明移动应用程序的真实性。

Frida

Inject your own scripts into black box processes. Hook any function, spy on crypto APIs or trace private application code, no source code needed. Edit, hit save, and instantly see the results. All without compilation steps or program restarts.

xPosed

Xposed is a framework for modules that can change the behavior of the system and apps without touching any APKs. That's great because it means that modules can work for different versions and even ROMs without any changes (as long as the original code was not changed too much). It's also easy to undo.

在我们深入研究移动应用证明技术之前,我想首先澄清开发人员之间的一个常见误解,即 WHOWHAT 正在调用 API 服务器。

访问 API 服务器的 WHO 和 WHAT 之间的区别

为了更好地理解 WHOWHAT 访问 API 服务器之间的区别,让我们使用这张图片:

预期通信渠道表示移动应用程序正按您的预期使用,由合法用户无恶意使用,使用移动应用程序的未篡改版本,并直接与 API 服务器通信中间的人被攻击了。

实际的渠道可能代表几种不同的场景,比如有恶意的合法用户可能正在使用重新打包的移动应用程序版本,黑客使用正版移动应用程序,而中间人攻击它,了解移动应用程序和 API 服务器之间的通信是如何进行的,以便能够自动攻击您的 API。还有很多其他可能的情况,但我们不会在这里一一列举。

我希望现在您可能已经知道为什么 WHOWHAT 不一样,但如果不一样一会儿就清楚了。

WHO 是移动应用程序的用户,我们可以通过多种方式对其进行身份验证、授权和识别,例如使用 OpenID Connect 或 OAUTH2 流程。

OAUTH

Generally, OAuth provides to clients a "secure delegated access" to server resources on behalf of a resource owner. It specifies a process for resource owners to authorize third-party access to their server resources without sharing their credentials. Designed specifically to work with Hypertext Transfer Protocol (HTTP), OAuth essentially allows access tokens to be issued to third-party clients by an authorization server, with the approval of the resource owner. The third party then uses the access token to access the protected resources hosted by the resource server.

OpenID Connect

OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. It allows Clients to verify the identity of the End-User based on the authentication performed by an Authorization Server, as well as to obtain basic profile information about the End-User in an interoperable and REST-like manner.

虽然用户身份验证可以让 API 服务器知道 WHO 在使用 API,但它不能保证请求来自 WHAT你所期待的,移动应用程序的原始版本。

现在我们需要一种方法来识别什么 正在调用API 服务器,这里事情变得比大多数开发人员想象的更棘手。 WHAT 是向 API 服务器发出请求的东西。它真的是手机的真实实例吗应用程序,或者是机器人、自动脚本或攻击者使用 Postman 等工具手动浏览 API 服务器?

令您惊讶的是,您最终可能会发现它可能是使用重新打包版本的移动应用程序或试图游戏化并利用应用程序提供的服务的自动化脚本的合法用户之一。

以上write-up摘自我写的一篇文章,标题为WHY DOES YOUR MOBILE APP NEED AN API KEY?,你可以完整阅读 here,这是关于 API 键的系列文章中的第一篇。

移动应用认证

移动应用证明解决方案的使用将使 API 服务器知道发送请求的内容,从而允许仅响应来自正版移动应用的请求,同时拒绝来自不安全来源的所有其他请求.

移动应用证明服务的作用是在 run-time 保证您的移动应用未被篡改或未被 运行 在已获得 root 权限的设备中被 运行 中的 SDK将与云中的服务 运行 通信以证明移动应用程序和设备的完整性的后台已 运行 开启。

在成功证明移动应用程序完整性后,会发布一个短时间的 JWT 令牌,并使用只有 API 服务器和云中的移动应用程序证明服务知道的秘密进行签名。如果移动应用证明失败,JWT 令牌将使用 API 服务器不知道的秘密进行签名。

现在,应用程序必须在每次 API 调用请求的 headers 中发送 JWT 令牌。这将允许 API 服务器仅在可以验证 JWT 令牌中的签名和过期时间时才为请求提供服务,并在验证失败时拒绝请求。

一旦移动应用程序不知道移动应用程序证明服务使用的秘密,即使应用程序被篡改,也无法在 run-time 对其进行逆向工程,运行 root 设备或通过成为中间人攻击目标的连接进行通信。

所以这个解决方案在没有误报的积极检测模型中工作,因此不会阻止合法用户,同时让坏人无法进入。

Approov(我在这里工作),移动应用证明服务已经作为 SAAS 解决方案存在,它为多个平台提供 SDK,包括 iOS、Android、React Native 和其他。集成还需要在 API 服务器代码中进行少量检查,以验证云服务发布的 JWT 令牌。此检查对于 API 服务器来说是必要的,以便能够决定处理哪些请求以及拒绝哪些请求。

结论

所以我建议您切换到通过 public 密钥固定证书,如果您想防止证书固定被绕过和其他威胁,那么您应该设计自己的移动应用证明解决方案或者使用即插即用的。

所以最后,必须根据您要保护的内容的价值和该类型的法律要求来选择用于保护您的移动应用程序和 API 服务器的解决方案数据,例如欧洲的 GDPR 法规。

您想加倍努力吗?

OWASP Mobile Security Project - Top 10 risks

The OWASP Mobile Security Project is a centralized resource intended to give developers and security teams the resources they need to build and maintain secure mobile applications. Through the project, our goal is to classify mobile security risks and provide developmental controls to reduce their impact or likelihood of exploitation.