移动应用程序中的客户端SSL证书有多安全?

时间:2012-03-18 23:00:04

标签: android ios security ssl client-certificates

我希望在我的Android / iOS应用和可访问互联网的后端服务之间进行安全通信,因此我正在调查HTTPS / SSL。

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

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

4 个答案:

答案 0 :(得分:13)

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

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

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

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

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

答案 1 :(得分:11)

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

答案 2 :(得分:9)

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

现在......你怎么办密码?这是问题的关键,你有两个选择。

如果您希望应用程序能够与服务器通信(以便能够访问证书)而无需用户交互,则需要将密码嵌入到您的应用程序中,然后是,攻击者可以撤消设计您的代码以找到它,获取密钥库,然后解密它以恢复证书。您可以应用混淆代码等技术,以便攻击者更难以这样做,但这只会减慢某些人的速度而不会阻止它。

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

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

答案 3 :(得分:4)

Daniel Guillamot,我过来的一些技巧:

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