【问题标题】:How and what server certificate to use with android SSL client certificate authentication如何以及使用什么服务器证书与 android SSL 客户端证书身份验证
【发布时间】:2011-05-09 23:10:58
【问题描述】:

我正在开发一个支持网络的 android 应用程序,它使用 SSL 客户端证书来验证和保护与我的服务器的连接。

我有两个问题:(1)我应该使用自签名服务器证书还是商业证书? (2) 我应该在用户安装的 apk 文件中包含服务器证书,还是应该让应用程序连接到我的服务器以通过网络获取服务器证书(为了使设备信任服务器证书)?

当我问我“应该”做什么时,我问的是每种选择的好处和坏处是什么?

现在我正在使用包含在 apk 文件中的自签名证书。当用户第一次运行应用程序时,它会将包含的自签名证书读入信任库,因此设备将连接到我的服务器而不会产生任何投诉。我想如果我使用商业证书,那么我的问题 #2 可能会变得毫无意义,因为设备可以毫无问题地信任来自服务器的证书。

另一个可能相关的细节:此应用程序不是通过 android 市场分发的。用户将从我的服务器下载应用程序,因此我可以包含我想要的任何服务器证书,如果需要,包括为每个用户提供不同的证书。

对于我的两个问题的每个可能答案的各种优点和缺点,我有自己的想法,但我对其他人(希望是出于安全考虑)对此事的看法很感兴趣。

提前致谢!

【问题讨论】:

  • +1 因为我遇到了类似的问题。你最终的方向是什么?
  • 我选择自签名证书的原因如下: (1) 商业证书的好处是浏览器识别。我的 android 应用程序是我创建的,因此我可以包含我想要的任何根证书,因此使用商业证书不会给我带来边际优势。另一方面,(2)商业证书引入了风险,因为现在我不仅容易受到针对我的安全性的攻击,而且还有证书颁发机构的攻击。如果 CA 被黑客入侵、丢失其私钥或被欺骗使用我的域名颁发服务器证书,我可能会受苦。机会渺茫,但为什么要抓住它?最后但并非最不重要的 (3) 钱。

标签: android ssl ssl-certificate


【解决方案1】:

我认为没有理由不自签名。不过,我会提高一个档次,并创建自己的证书颁发机构。这使您可以确保仅连接到具有由您的自定义 CA 签名的证书的服务器,这比服务器上证书的简单指纹检查要好得多(即实际的加密安全性)。

这是一个如何使用 Ruby 的 OpenSSL 绑定创建自定义 CA 的示例。该过程在大多数语言中是相同的。 https://github.com/augustl/ruby-openssl-cheat-sheet/blob/master/certificate_authority.rb

当然,您也可以使用必须由您的自定义 CA 签名的客户端证书,以便您的服务器接受请求。请注意,这只是默默无闻 - 攻击者将能够从您的应用程序中提取私钥和自定义 CA 签名证书。如果您的应用可以向服务器发出请求,那么任何人都可以:)

【讨论】:

  • 如果我签署了自己的服务器证书,那么根据定义,我就是一个证书颁发机构。至于提取私钥,您描述的问题不适用于我的应用程序,因为应用程序本身会在用户第一次运行它时生成自己的私钥。与应用程序一起分发的唯一内容是服务器证书和可选的插入到 apk 中的唯一令牌,以防止人们相互共享应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2016-05-24
  • 2014-05-31
相关资源
最近更新 更多