27

我想在我的 Android/iOS 应用程序和可访问 Internet 的后端服务之间进行安全通信,因此我正在研究 HTTPS/SSL。

如果我创建自签名证书,然后将客户端证书放入应用程序并导致后端服务要求客户端证书,这真的安全吗?

这就是我问的原因。似乎可以通过询问 .apk 来“破解”客户端证书。客户端证书只是一个字符串常量,对吧?这意味着任何人都可以使用客户端证书访问我的后端。.apk(和 iOS 等效项)是否足够不透明以防止发现客户端证书

4

5 回答 5

15

您是否使用 SSL 证书进行客户端身份验证?并不是说这个问题真的很重要。攻击者可以访问您存储在应用程序中的任何私钥。每个客户端都应该有自己的证书和密钥对,以防止大规模泄露。您的服务器还应该强制执行保护措施,确保受感染的客户端不能只请求任何内容。

对于任何身份验证方案都是如此。如果您嵌入密码、API 密钥、解密密钥等。设备上的任何东西都应该被认为是可访问的。

证书增加的安全性部分来自于没有什么可以暴力破解的。如果您为每个客户端使用用户名/密码路由,则可以猜出密码。与 API 密钥相同(尽管它们更长更难)。使用证书,这是一种完全不同的攻击类型,也是一个相当困难的问题。

但是,最重要的是,后端服务不应该允许应用程序做任何它通常不会做的事情。

现在,处理证书,您将遇到一大堆其他问题。您可能希望使用自签名 CA 证书签署每个客户端证书。根据您的用例,管理该 CA 证书可能会有问题。您是要即时生成这些客户端证书,还是自己手动生成?意思是,这是一个百万人可以下载的应用程序,你需要一个自动生成它们的系统吗?或者这是您个人将处理生成证书的私有/内部应用程序?

于 2012-03-19T05:09:11.050 回答
13

证书是无害的。需要保护的是私钥,它只和设备本身一样安全,并不安全。与应用程序一起分发证书和私钥只是意味着拥有该应用程序的任何人都拥有密钥,因此它不会为您提供任何安全性。我认为您需要某种安装后注册步骤。

于 2012-03-19T05:40:14.973 回答
12

通常,客户端 SSL 证书存储在密钥库中(在 Android 的情况下为 BKS 格式),并且密钥库作为资源包含在您的 APK 中。密钥库被加密并使用密码保护。因此,该客户端证书无法从 APK 中轻松提取,因为它以加密形式存储。

现在......你对密码做了什么?这是问题的症结所在,您有两种选择。

如果您希望您的应用程序能够在没有用户交互的情况下与服务器通信(因此,能够访问证书),您需要将密码嵌入到您的应用程序中,然后,是的,攻击者可以对您的代码进行逆向工程找到它,获取密钥库,然后解密它以恢复证书。您可以应用诸如混淆代码之类的技术,以便攻击者更难这样做,但这只会减慢某人的速度而不是阻止它。

您的替代方法是每次应用程序与服务器通信时提示用户输入密码并使用它来解密密钥库(或询问应用程序何时启动并将证书缓存一段时间)。这里的好处是,如果有人对您的 APK 进行逆向工程,他们会找到加密的密钥库并且没有密码,因此您的证书是安全的。缺点是让用户提供密码。

哪种方法最好?这完全取决于您关注的数据的敏感性以及您愿意接受的风险水平。只有你可以回答那个问题。

于 2012-03-19T12:44:56.767 回答
4

Daniel Guillamot,我发现了一些技巧:

如果有人有其他想法,我很乐意听到更多。

于 2012-03-29T16:44:20.010 回答
1

APK 可以被访问和复制,因此在其中放任何东西都无济于事。安装后需要激活并可能将证书绑定到设备。例如,可以通过将设备的 IMEI 放入证书扩展名之一并通过您的应用程序将 IMEI 与证书一起传递(或者,更好的是,在身份验证和建立安全通道后传递 IMEI)来完成绑定。

于 2012-03-19T06:28:08.070 回答