【问题标题】:Okhttp - Certificate Pinning and Public Key PinningOkhttp - 证书固定和公钥固定
【发布时间】:2017-12-17 06:03:03
【问题描述】:

我想提高我的 Android 应用程序的安全性。我正在使用 OkHttp 版本 3。

如何:

1) 在 OkHttp 中使用证书固定。

2) 在 OkHttp 中使用公钥固定。

当我这样做时:

httpClient.certificatePinner(new CertificatePinner.Builder()
            .add(BuildConfig.HOST_NAME, "sha256/VRtYBz1boKOAjChfZYssN1AeNZCjywl77l2RTl/v110=")
            .build());

证书固定工作。但是公钥固定呢?如何启用它?

【问题讨论】:

  • @CommonsWare 是否意味着上述解决方案同时执行(证书和公钥固定)?
  • 从技术上讲,它正在做公钥固定。 “证书固定”和“公钥固定”具有相同的基本效果。在 Android 上(使用 OkHttp 和 Android 7.0 的网络安全配置),我们一直使用术语“证书固定”来表示真正的“公钥固定”。就个人而言,我需要更好地正确使用这些术语。我不知道有任何实现真正证书固定的 Android 解决方案。
  • 感谢@CommonsWare 的帮助!
  • 为了清楚起见,OkHttp 不支持通过 Http 响应标头的 HPKP (en.wikipedia.org/wiki/HTTP_Public_Key_Pinning)。但是手动检查(包括您的应用从响应标头中抓取和存储引脚以供将来会话使用)将起作用。

标签: android okhttp3 certificate-pinning public-key-pinning


【解决方案1】:

证书固定工作。但是公钥固定呢?如何开启?

从 Android API 24 开始,您可以通过 res/xml/network_security_config.xml 文件为任何 Http 堆栈执行此操作,如其 docs 中所述:

<?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 摘要。

我建议您使用Mobile Certificate Pinning Generator 来帮助您实施证书固定。这个免费的在线工具将为您生成给定域的 SHA-256 摘要,并提供一个 network_security_config.xml 文件,准备好复制粘贴到您的项目中。

例如,如果在您的移动应用项目中,您想在域 httpbin.orgexample.com 上进行假设固定:

出现警告是因为未提供备份 pin,最佳做法是始终通过上传对域有效且尚未实时使用的备份证书文件来提供一个。

现在您只需按照同一页面中的说明将配置复制粘贴到您的项目中:

在您的项目中创建文件 ./main/res/xml/network_security_config.xml。

复制上面的证书固定xml配置并粘贴到文件中。

打开您的 AndroidManifest.xml 文件并在应用程序标签内添加以下代码 sn -p android:networkSecurityConfig="@xml/network_security_config"。

重新构建您的移动应用并仔细检查您是否仍然可以向 API 发出请求。

或者您可以通过 Pin Test App 示例 repo 学习如何操作:

此存储库提供了使用此 Approov 免费工具将证书固定集成到您的移动应用程序的基本步骤。本指南专为 API 24 (Android 7.0) 及更高版本的原生 Android 应用编写,您希望通过证书固定来保护 API 调用。

要遵循本指南,您只需在您的机器上安装 Android 开发设置。

注意:切勿锁定您无法控制的域。例如,您的移动应用程序用于连接第三方服务的那些。要锁定此域,您需要使用反向代理。你可以在我写的关于Using a Reverse Proxy to Protect Third Party APIs的文章中了解更多:

在本文中,您将首先了解什么是第三方 API,以及为什么不应该直接从移动应用中访问它们。接下来,您将了解什么是反向代理,以及何时以及为何使用它来保护对移动应用中使用的第三方 API 的访问。

【讨论】:

    猜你喜欢
    • 2019-10-03
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2014-04-01
    • 2013-03-21
    相关资源
    最近更新 更多