【发布时间】:2019-10-03 00:55:18
【问题描述】:
我试图了解证书固定和公钥是如何完成的。 在阅读了不同的博客后,我对这个概念更加困惑,因此我添加了这个问题。我想知道 1.如何通过示例实现证书锁定
2.如何通过示例实现公钥锁定
【问题讨论】:
标签: android android-studio ssl openssl ssl-certificate
我试图了解证书固定和公钥是如何完成的。 在阅读了不同的博客后,我对这个概念更加困惑,因此我添加了这个问题。我想知道 1.如何通过示例实现证书锁定
2.如何通过示例实现公钥锁定
【问题讨论】:
标签: android android-studio ssl openssl ssl-certificate
证书或公钥 pining 只是例外连接证书信息的“白名单”,因此您可以确认您连接的对象是您希望连接的对象。基本上它可以在中间情况下检测到人。
检查out 作为一个很好的总体概述。
证书固定和公钥固定之间的唯一区别是您在白名单中检查的数据。由于证书包含公钥,您可以认为证书是被检查数据的超集。您检查的内容将决定您想要检测较小的证书“更改”的严格程度。
还有很多方法可以实现上述链接中所述的固定。这取决于您决定检查的内容以及如何将其存储在白名单中。由于您在谈论 Android,因此上面的链接提到了 Android 推荐的方式,因此您可能想研究一下。
您可能希望查看的另一个实现是Mozilla pining implementation,它使用以十六进制形式存储的公钥的 sha256 哈希白名单来固定公钥。
更新: 正如@Robert 所提到的,除了标准的证书链检查之外,还应该进行证书固定。它不应该取代标准的证书链检查,特别是在根/中间证书级别锁定时。
固定根或中间固定可能会降低安全性,但对证书更改更具弹性。使用这种类型的设置取决于您使用证书固定的原因以及您是否可以轻松更新客户端白名单。这些是您根据具体情况做出的安全权衡。
【讨论】:
1.如何通过示例实现证书锁定
在我看来,您不应该采用这种方法,因为您需要在移动应用二进制文件中对证书进行硬编码,因此要求每次更新它们时,都需要提前发布一个新版本的移动设备,以支持这两个证书都需要强制所有用户升级。在所有用户都升级后,您需要发布另一个版本的移动应用程序以删除旧证书。
2.如何通过示例实现公钥锁定
这里最好的方法是使用Mobile Certificate Pinning Generator 在线工具,该工具将创建适当的网络安全配置文件以添加到 Android 应用程序中。
我建议您阅读this answer 中的Preventing MitM Attacks 部分,我提出了另一个问题,您将在其中学习如何实现静态证书固定以及如何绕过它:
在移动应用中实现静态证书锁定的最简单快捷的方法是使用 [Mobile Certificate Pinning Generator](Mobile Certificate Pinning Generator),它接受您要锁定的域列表并为其生成您可以在 Android 和 iOS 上使用正确的证书固定配置。
给它一个要固定的域列表:
该工具会为您生成 Android 配置:
该工具甚至作为说明如何将配置添加到您的移动应用程序,您可以在证书固定配置框下方找到该工具。他们还为Android 和iOS 提供了一个示例引脚测试应用程序,这是一个分步教程。
这种方法不需要在每次使用相同的公钥更新证书时发布新的移动应用程序。
【讨论】: