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

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

如果我创build自签名证书,然后在应用程序中放置一个客户端证书,并导致后端服务要求客户​​端证书, 这是真正安全的

这就是为什么我问。 看来,客户端证书可能会通过询问.apk被“黑客入侵”。 客户端证书只是一个string常量,对吗? 这意味着任何人都可以使用客户端证书来访问我的后端。 .apk(和iOS等效)是否足够不透明以防止发现客户端证书

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

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

对于任何validationscheme都是如此。 如果你embedded密码,API密钥,解密密钥,不pipe。 设备上的任何东西都应该被认为是可访问的。

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

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

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

通常情况下,客户端SSL证书存储在密钥存储区(Android中为BKS格式),密钥库作为资源包含在您的APK中。 密钥库被encryption并用密码保护。 因此,客户端证书不能轻易从APK中提取,因为它以encryptionforms存储。

现在…你对密码怎么办? 这是事情的症结,你有两个select。

如果您希望应用程序能够与服务器进行通信(以便能够访问证书)而无需用户交互,则需要将密码embedded到应用程序中,然后,攻击者才能对您的代码进行逆向工程find它,抓住密钥库,然后解密它来恢复证书。 你可以应用像混淆你的代码这样的技术,这样攻击者很难这样做,但是这只会减慢一些人的速度,而不是阻止它。

另一种方法是在每次应用程序与服务器通信并使用它来解密密钥库(或者询问应用程序何时启动并caching证书一段时间)时提示用户input密码。 这样做的好处是,如果有人反向工程你的APK,他们会findencryption的密钥库,没有密码,所以你的证书是安全的。 缺点是让用户提供密码。

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

丹尼尔·吉拉莫(Daniel Guillamot),我已经过去了一些技巧:

  • 拆分服务器端的密钥。 使SSL密钥的密码是由webservice中的应用程序中的XORstring提取的结果。
  • 通过调用一些应用程序函数来创build应用程序中的string,而不是硬编码的string。
  • 拒绝在应用程序运行时追踪应用程序,以避免有人在调用私钥解密时捡起最终密码。 Ref: http : //books.google.no/books? id= 2D50GNA1ULsC& lpg= PA294& ots= YPQQ7DLjBD& dq= The%20example%20just%20shown%20demonstrates%20how%20calls%20to%20ptrace%20can%20be%20hijacked& hl= no& pg= PA293# v =&onepage q&F =假

如果有人有其他的想法,我很想听听。

APK可以被访问和复制,所以放入任何东西都无济于事。 激活并且可能在安装之后将证书绑定到设备是必要的。 绑定可以通过将设备的IMEI设置为其中一个证书扩展名,然后将IMEI与证书一起传递给您的应用程序(或者,最好是validation通过build立安全通道,然后通过IMEI)来完成。