使用CA证书足以安全地与SSLServerSocket通信吗?

时间:2019-07-10 21:33:10

标签: java android ssl ssl-certificate

我有一个Java SSL服务器应用程序,并且能够使用自签名证书和密钥对与其客户端通信。这是在我的开发机器上完成的。

现在,是时候在实时服务器上启动应用程序了,我已经从授权机构(LE)获得了SSL证书。

我可以导出签名的证书,并将其导入到我的Android客户端的Bouncy Castle密钥库中。但是,有一件事让我开始思考。如果证书过期,则意味着我必须每次都更新应用程序。我不想这样做,感觉工作太多。

我正在阅读此page,他们提到(第 SSL密钥 ,项目编号 3 ), CA证书足以建立连接。

  

[可选地]导出您的私钥的公钥证书,然后   将其分发给将与您互动的SSL各方。 (看到   “从密钥库导出公共密钥证书”部分)   使用来自证书颁发机构的证书,那么它将   足以让其他人仅拥有证书的证书   权威本身。

我想知道它的安全性以及它的含义(如果有)。

该想法是避免每次证书更新时都重新编译客户端应用程序。

谢谢。

1 个答案:

答案 0 :(得分:1)

根据我的收集,只有您的客户端在验证您的服务器,而不是相反。这是一种身份验证方式,因为两方中只有一方在对另一方进行身份验证。我可能错了,您可能正在进行相互认证,但是我们会解决的。首先,让我们考虑一下更简单的情况。

为了让您的客户端对您的服务器进行身份验证,服务器需要一个带有私钥的SSL证书,看起来像您拥有的那样。该证书由CA证书签名,而CA证书可能由Root证书签名。为了使您的客户端信任您的服务器,它需要客户端信任的用于签署ssl证书的CA证书列表。此证书列表是您的信任库。您的信任库应具有受信任CA的根目录和CA证书。

如果服务器的SSL证书过期,则需要为服务器获取新的证书。如果您的新证书是由与旧证书相同的CA签署的,则客户端将继续信任您的服务器,而不会进行任何更新。但是,如果新证书是由客户端未知的CA签名的(即CA证书不在信任库中),则需要使用CA和新证书的根证书来更新客户端的信任库。

这描述了一种身份验证方式。但是,如果您的应用程序需要双向身份验证,则除了客户端对服务器进行身份验证外,服务器还需要对客户端进行身份验证。过程完全相同,但是相反。客户端还将需要ssl证书,服务器也将需要带有签名客户端证书的Root / CA证书的信任库。适用与服务器验证客户端时相同的规则。因此,如果客户端的ssl证书过期且服务器的信任库不知道新证书,则必须使用新的CA证书来更新信任库。

一种解决方法,必须手动更新您的信任库是使用您信任的CA自动获取新的信任库。这就是您的浏览器所做的。但是,如果需要新证书,您仍然需要更新您的应用程序。