证书固定工作。但是公钥固定呢?如何启用它?
从 Android API 24 开始,您可以通过他们的文档res/xml/network_security_config.xml
中描述的文件为任何 Http 堆栈执行此操作:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<pin-set expiration="2018-01-01">
<pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
<!-- backup pin -->
<pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
</pin-set>
</domain-config>
</network-security-config>
这种方法比以前的方法更容易实现,但仍然容易出现配置错误和拼写错误,而且您需要知道如何从要固定的证书的公钥中正确创建 SHA-256 摘要。
我建议您使用移动证书固定生成器来帮助您实现证书固定。这个免费的在线工具将为您生成给定域的 SHA-256 摘要,并提供network_security_config.xml
准备好复制粘贴到您的项目中的文件。
例如,如果在您的移动应用程序项目中,您想假设针对域httpbin.org
和example.com
:
出现警告是因为没有提供备份 pin,最佳做法是始终通过上传对域有效且尚未实时使用的备份证书文件来提供一个。
现在您只需按照同一页面中的说明将配置复制粘贴到您的项目中:
在您的项目中创建文件 ./main/res/xml/network_security_config.xml。
复制上述证书固定 xml 配置并将其粘贴到文件中。
打开您的 AndroidManifest.xml 文件并在应用程序标记中添加以下代码片段 android:networkSecurityConfig="@xml/network_security_config"。
重新构建您的移动应用程序并仔细检查您是否仍然可以向 API 发出请求。
或者您可以通过Pin Test App示例 repo学习如何做到这一点:
此 repo 提供了使用此 Approov 免费工具将证书固定集成到您的移动应用程序的基本步骤。本指南专为 API 24 (Android 7.0) 及更高版本的原生 Android 应用编写,您希望通过证书固定来保护 API 调用。
要遵循本指南,您只需要在您的机器上进行 Android 开发设置。
注意:切勿锁定您无法控制的域。例如,您的移动应用程序用于连接第三方服务的那些。要锁定此域,您需要使用反向代理。您可以在我写的关于使用反向代理保护第三方 API的文章中了解更多信息:
在本文中,您将首先了解第三方 API 是什么,以及为什么不应该直接从移动应用程序中访问它们。接下来,您将了解什么是反向代理,以及何时以及为何使用它来保护对移动应用程序中使用的第三方 API 的访问。