如何使用什么服务器证书与Android SSL客户端证书认证一起使用

5

我正在开发一款使用SSL客户端证书来验证和保护与我的服务器的连接的网络安全的安卓应用程序。

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

当我问“应该”做什么时,我是在问每种选择的利弊有哪些?

现在我正在使用包含在apk文件中的自签名证书。当用户第一次运行应用程序时,它会将包含的自签名证书读入信任库,以便设备可以无误地连接到我的服务器。我想如果我使用商业证书,那么我的第二个问题可能就没有意义了,因为设备可能会毫无问题地信任来自服务器的证书。

还有一个可能相关的细节:这个应用程序并不通过安卓市场进行分发。用户将从我的服务器下载该应用程序,因此我可以包含任何我想要的服务器证书,甚至为每个用户都提供一个不同的证书。

我对我的两个问题的各种答案的优点和缺点有自己的想法,但我对其他人的看法也感兴趣,尤其是那些对安全有关注的人。

提前感谢您!


1
+1,因为我遇到了类似的问题。你最终选择了哪个方向? - John Livermore
我选择自签名证书的原因如下:(1)商业证书的好处在于浏览器识别。我的安卓应用是我自己创建的,因此我可以包含任何根证书,因此使用商业证书对我没有任何边际优势。另一方面,(2)商业证书会引入风险,因为现在不仅我容易受到攻击,而且认证机构也容易受到攻击。如果CA被黑客攻击、失去私钥或被欺骗发出带有我的域名的服务器证书,我可能会遭受损失。虽然几率很小,但为什么要冒这个险呢?最后(3)是钱的问题。 - Adam Mackler
1个回答

1
我认为没有理由不进行自签名。但是,我会更进一步地创建自己的证书颁发机构。这样可以确保您只连接到由您的自定义CA签名的证书的服务器,这比仅对服务器上的证书进行简单指纹检查要好得多(即实际的加密安全性)。
以下是使用Ruby的OpenSSL绑定创建自定义CA的示例。在大多数语言中,该过程都是相同的。https://github.com/augustl/ruby-openssl-cheat-sheet/blob/master/certificate_authority.rb 当然,您也可以使用客户端证书,该证书必须由您的自定义CA签名才能使您的服务器接受请求。请注意,这只是混淆 - 攻击者将能够从您的应用程序中提取私钥和自定义CA签名的证书。如果您的应用程序可以向服务器发出请求,任何人都可以这样做 :)

如果我签署自己的服务器证书,那么根据定义,我就是作为证书颁发机构行事。至于提取私钥,你所描述的问题并不适用于我的应用程序,因为该应用程序本身在用户第一次运行时生成自己的私钥。与应用程序一起分发的唯一内容是服务器证书和可选地插入到apk中以防止人们相互共享应用程序的唯一标识符。 - Adam Mackler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接