2011-05-09 123 views
5

我正在开发支持网络的android应用程序,该应用程序使用SSL客户端证书对我的服务器进行身份验证和安全连接。如何以及使用何种服务器证书与Android SSL客户端证书身份验证

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

当我问我该“应该”做什么时,我在问每个选择有哪些好处和坏处?

现在我正在使用包含在apk文件中的自签名证书。当用户第一次运行应用程序时,它会将包含的自签名证书读取到信任存储中,以便设备无需投诉即可连接到我的服务器。我想如果我使用商业证书,那么我的问题#2可能会变得没有实际意义,因为设备可能信任来自服务器的证书而没有问题。

一个更可能相关的细节:这个应用程序不是通过安卓市场发布。用户将从我的服务器上下载应用程序,这样我可以包含任何我想要的服务器证书,如果需要的话,还可以为每个用户提供不同的服务器证书。

我对我的两个问题的每个可能答案的各种优点和缺点有自己的想法,但我对其他人 - 希望安全意识 - 在这个问题上不得不说的话感兴趣。

提前致谢!

+1

+1,因为我面临类似的问题。你最终走向了什么方向? – 2012-03-23 15:09:41

+0

我选择了自签名证书,原因如下:(1)商业证书的好处是浏览器识别。我的android应用程序是我创建的,所以我可以包含任何我想要的根证书,因此使用商业证书并不会带来任何边缘优势。另一方面,(2)商业证书带来了风险,因为现在我不仅容易受到攻击我的安全,而且容易受到证书颁发机构的攻击。如果CA遭到黑客攻击,丢失私钥或被欺骗发布带有域名的服务器证书,我可能会受到影响。机会渺茫,但为什么要拿?最后但并非最不重要的(3)钱。 – 2013-04-06 10:54:57

回答

1

我看不出没有自签的理由。尽管如此,我会提高一个档次,并创建自己的认证中心。这样可以确保您只能连接到具有由您的自定义CA签名的证书的服务器,这比对服务器上的证书进行简单的指纹检查要好得多(即实际的加密安全性)。

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

您当然也可以使用必须由自定义CA为您的服务器签名的客户端证书才能接受请求。请注意,这只会是隐晦的 - 攻击者将能够从您的应用中提取私钥和自定义的CA签名证书。如果你的应用可以向服务器发送请求,任何人都可以:)

+0

如果我签署自己的服务器证书,那么根据定义,我充当证书颁发机构。 至于提取私人密钥,他们描述的问题不适用于我的应用程序,因为应用程序本身在用户第一次运行它时会生成它自己的私人密钥。与应用程序一起分发的唯一东西是服务器证书和可选的插入到apk中的唯一标记,以防止人们彼此共享应用程序。 – 2013-08-10 03:15:55