gpt4 book ai didi

android - Webview 证书固定

转载 作者:行者123 更新时间:2023-12-04 14:10:49 30 4
gpt4 key购买 nike

我正在 Android 中实现一个 WebView,它加载了一个 https 网站。在这个网站上,我想进行证书锁定,这意味着我想检查服务器所服务的证书的某些方面。但是我看到 WebViewClient 中没有任何方法可以让我拦截请求并检索证书。

在互联网上有很多人说它无法完成,证书固定在Androids WebView上。所以我希望这里的任何人都知道更多。

最佳答案

Android 中的证书固定

Android 上的证书固定在 this 中有很好的描述文章。

Android 中用于证书固定的主要里程碑是 Android 7.0 Nougat (SDK 24),因为 Network Security Configuration允许应用程序定义自己的规则集。

我建议使用 TrustKit Android library在 Android 上管理证书固定:它支持大多数库(OkHttp 等)并且与 Android SDK 24 设置兼容。

Webview 证书固定

但是请记住, Android 7.0 之前 无论您使用什么库,您都无法真正管理 Web View 上的固定,接下来的任何事情都是一种解决方法。

如果您有 minSDK 7.0 只需使用上面的库,无需执行任何其他操作。

shouldInterceptRequest 解决方法

Pre-Nougat 您对 Webviews 的最佳选择是实现您自己的 WebviewClient并手动执行调用,在 shouldInterceptRequest() 中进行证书锁定方法。

您可以在 this project 中找到此类示例。 .
shouldInterceptRequest() Pre Lollipop (5.0 - SDK 21) 除了 URL,没有标题,没有正文,没有其他任何内容。这意味着除了加载 URL 并希望 webapp 不需要其他任何东西(标题等)之外,你真的不能做更多的事情。

由于 Lollipop,您有另一种方法可以为您提供 WebResourceRequest对象具有更多信息,因此您可以正确地重现请求。

仅 GET 请求

不分安卓版本shouldInterceptRequest()永远不会收到anything but GET requests ; POST/PUT/DELETE 不可拦截 !!

Lollipop 之前的性能问题

此外,如果您将上述方法与 shouldInterceptRequest() 一起使用您可以介绍major performance issues :before October 2015 Android Webview 有一个错误,并且总是在同一线程上执行该方法导致阻塞队列:同一线程用于 javascript,导致明显 "freeze" of the webview .自 Lollipop 以来,Webview 已随系统升级,但在此之前问题仍然存在。

拦截 PUT/POST/DELETE 的解决方法的解决方法

您可以注入(inject)自定义 Javascript 接口(interface)来拦截 Ajax 调用,并使用 OkHttp 或用于 HTTP 请求和证书固定的任何库手动执行它们。

如果你真的想走这条路have a look at this library ,它不支持表单,只支持 Ajax 调用,但可以用类似的方式完成,如 this other library 所示。 .

但!!!我根本不推荐这个!!!!作者本人,我引用,说:

[..]I wasn't happy with my adaption of this so far.[...]



因为这是一个丑陋的黑客!

解决性能问题的解决方法

您可以考虑预取资源,以便在 shouldInterceptRequest() 中请求它们时您不必提取它们。方法。这要求您已经知道您需要的所有资源,我不必告诉您它最终可能会使用用户可能永远不会使用的大量带宽和磁盘空间。
shouldInterceptRequest() 的替代方案

如果您可以控制提供 Webview 数据的服务器,您可以尝试依赖 HPKP ,这基本上意味着您的服务器应该与每个请求一起返回一个列出您证书的 SHA256 摘要的 header :然后浏览器(在这种情况下是 webview)应该选择它并确保下一个请求仅在以下情况下通过你的证书是一样的。

当然这意味着你第一次没有保护,所以你可能需要 shouldInterceptRequest()的组合。和HPKP。

如果您在设置 HPKP 时犯了一些错误(如我提供的链接中所述),也很容易让自己陷入困境。

而且,猜猜看,首先推出 HPKP 的 Google deprecated it in 2017因为设置困难和错误风险。这也意味着最近的 Webviews 或将来可能不支持它。

结语

如果您真的想安全地固定证书,请避免使用 webviews 或以 minSDK 24 (Android 7.0) 为目标。

也考虑这个...

缺点

这些缺点在证书固定上是通用的,与 Android 版本无关。

代理:如果您进行证书固定,请忘记您的应用程序正在处理这些代理。通常,通过代理建立 HTTPS 连接的唯一方法是在您的设备上安装代理证书并使代理成为“中间人”。如果您固定证书不起作用,无论如何。

重定向:如果您固定证书并且您有更改域的 HTTP 重定向 (301/302),您还需要固定另一个域。

动态内容:如果您的应用管理动态内容(用户提供的 URL 输入或不受您控制) 您不允许任何超出固定域/证书列表的内容,这些 URL 将不会被接受,并且无论如何您都无法固定它们,因为您无法预测它们将拥有哪个域/证书(这也是重定向为真)。

你真的需要证书固定吗?

没有网络固定,世界各地的计算机浏览器都不使用证书固定。 HPKP(上面讨论过)已被 Google 自己弃用,到目前为止还没有人提示它。每个浏览器都使用受信任的证书颁发机构列表。

同样的事情由移动设备完成。

浏览器和移动应用程序的主要区别在于浏览器会清楚地显示证书信息以及网页是否安全;而应用程序可以做任何它想做的事情,而无需向用户显示任何内容。您可以将 PC 应用程序与应用程序进行比较,以获得更公平的比较。

您需要了解固定证书对您的应用程序安全的真正作用:它使中间人攻击无法实现。即使受到攻击的设备(用户/攻击者安装了恶意证书颁发机构)也不允许建立通信,因此有人可以嗅探您的应用程序正在发送和接收的内容。

为了使攻击者成功地对固定证书域执行中间人攻击,他必须获得实际证书或能够生成有效证书(来自受信任的证书颁发机构)。

历史上唯一一次受信任的证书颁发机构遭到入侵是 DigiNotar在 2011 年。除了这样的情况之外,打破信任链的唯一方法是使用受感染的设备(无论是 PC 还是手机)。

你需要保护用户免受自己的伤害吗? (又名 = 在他的设备上安装一个假的/恶意的证书颁发机构)然后使用你的应用程序并让他自己的数据和凭证被中间人窃取。

您是否需要防止用户窃取您通过安全连接发送的数据? (api key 、 token 等...)——请记住,有更好的策略来处理这个问题,通常可以撤销 api key 和 token 。

您可能只需要保护应用程序使用的一些 API。 OWASP suggest ,当然要始终固定,但我更倾向于认为您应该衡量对这给您带来的威胁的保护。这完全是我的意见。

OWASP 还说另一件重要的事情 DO NOT DO IT MANUALLY, 您可能会创建比您试图解决的更大的安全威胁! (这与上面讨论的所有解决方法背道而驰)。我 100% 同意这一点。使用 TrustKit。

关于android - Webview 证书固定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33932507/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com