我正在尝试学习制作安全的移动应用程序。我很想知道,如果我们从移动设备到服务器的网络调用使用 https ,我们是否需要证书固定?
2 回答
我很想知道,如果我们从移动设备到服务器的网络调用使用 https ,我们是否需要证书固定?
https 保证您的移动应用程序和 API 服务器之间传输的数据是加密的,并且不会被第三方窥探,从而部分地防止了中间人攻击。
所以我说部分是因为攻击者可以诱使用户安装自定义 ssl 证书,以便他们使用免费 wifi。这通常是通过伪造的 wifi 强制门户来完成的,您必须在其中登录才能获得免费 wifi,例如您在机场、火车等中发现的那些。如果攻击者成功欺骗用户,那么所有流量都会通过攻击者的计算机,尽管是https,一旦移动应用程序使用攻击者自定义证书就可以解密,但是攻击者在与API服务器通信时将始终使用原始证书,因此API、服务器、移动应用程序或用户都不是意识到通信正在被拦截,甚至可能被篡改。
因此,使用证书固定将防止发生任何类型的中间人攻击,即使移动应用程序的用户是攻击者故意解密自己的流量,以便对移动应用程序与 API 服务器的通信进行逆向工程为了获得足够的知识来对它发起攻击。
现在是坏消息的时候了……当攻击者访问或控制移动设备时,可以绕过证书固定。本文将向您介绍如何使用xPosed 之类的框架来使用和绕过证书固定,该框架将拦截验证证书的调用,从而绕过验证过程。
那么我应该使用证书固定吗?是的,你应该这样做,因为这是一层防御,并且攻击者需要更多的努力来对你的移动应用程序进行逆向工程,他可能认为不值得付出努力,但如果他认为值得付出努力,那么你可能想在谷歌中搜索用于移动应用程序证明解决方案,以进一步保护移动应用程序和 API 服务器之间的通信。
但请记住,虽然证书锁定可能很容易在您的移动应用程序中实施,但维护起来可能是一场噩梦。请务必阅读我之前提到的关于绕过证书锁定的链接中的“锁定是一场噩梦”部分。
编辑
您可以阅读文章Steal that API Key with a Man in the Middle Attack查看一个实际示例,了解如何通过执行 MitM 攻击从从移动应用程序发送到后端 API 的 https 请求中提取秘密。
因此,在本文中,您将学习如何设置和运行中间人攻击,以拦截您控制的移动设备中的 https 流量,从而窃取 API 密钥。最后,您将了解如何缓解中间人攻击。
虽然我们可以使用 JNI/NDK 等高级技术将 API 密钥隐藏在移动应用程序代码中,但它不会阻止某人执行中间人攻击以窃取 API 密钥。事实上,中间人攻击很容易,甚至可以由非开发人员实现。
之后,您还可以查看文章Securing HTTPS with Certificate Pinning on Android以了解如何实施证书固定以防止中间人攻击。
在本文中,您了解到证书锁定是将域名与其预期的 X.509 证书相关联的行为,这对于保护证书链中基于信任的假设是必要的。错误颁发或泄露的证书是一种威胁,还需要保护移动应用程序免受其在公共 wifi 等恶劣环境中的使用或 DNS 劫持攻击。
您还了解到,在处理个人身份信息或任何其他敏感数据的任何时候都应该使用证书固定,否则移动应用程序和 API 服务器之间的通信通道可能会被攻击者检查、修改或重定向。
最后,您学习了如何通过在 Android 应用程序中实施证书锁定来防止中间人攻击,该应用程序利用现代 Android 设备的网络安全配置文件,后来又使用了支持现代和旧设备证书锁定的 TrustKit 包。
我希望这两篇文章都更清楚地说明了为什么建议使用证书固定来保护 https 连接免受窥探。
编辑 2
如果您想实现证书固定但又害怕在创建network_security_config.xml
配置文件时出错,那么只需使用这个免费的移动证书固定生成器为您创建它:
它会给你一个network_security_config.xml
准备好复制粘贴的配置文件:
是的,您应该将其保存为应用程序文件夹中的原始文件,并使用它来调用服务器以获取请求。请注意,如果您有自签名证书,则应按照受信任的权威机构强制执行该证书。