Java 使用CA证书是否足以与SSLServerSocket安全通信?

Java 使用CA证书是否足以与SSLServerSocket安全通信?,java,android,ssl,ssl-certificate,Java,Android,Ssl,Ssl Certificate,我有一个JavaSSL服务器应用程序,我能够使用自签名证书和密钥对与客户机通信。这是在我的开发机器上完成的 现在,是在实时服务器上启动应用程序的时候了,我已经从权威机构(LE)获得了SSL证书 我可以导出签名证书,并将其导入Android客户端的Bouncy Castle密钥库。然而,有一件事让我思考。如果证书过期,则意味着每次都必须更新应用程序。我不想这样做,感觉工作太多了 我正在读这篇文章,他们提到(第节SSL密钥,项目编号3),只要有CA证书就足以建立连接 [可选]导出私钥的公钥证书,然后

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

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

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

我正在读这篇文章,他们提到(第节SSL密钥,项目编号3),只要有CA证书就足以建立连接

[可选]导出私钥的公钥证书,然后 将其分发给将与您交互的SSL各方。(见 “从密钥库导出公钥证书”部分(如果您是 使用来自证书颁发机构的证书,则 足以让其他人只拥有证书的证书 权威本身

我想知道这有多安全,有什么影响(如果有的话)

这样做的目的是避免每次更新证书时重新编译客户端应用程序


谢谢。

据我所知,只有您的客户端正在验证您的服务器,而不是相反。这是单向身份验证,因为双方中只有一方在验证另一方。我可能错了,你可能在做相互认证,但我们会解决的。首先让我们考虑更简单的情况。

为了让您的客户机对服务器进行身份验证,服务器需要一个SSL证书,其中包含一个私钥,您似乎拥有私钥。此证书由CA证书签名,CA证书可能由根证书签名。为了让您的客户端信任您的服务器,它需要一个CA证书列表,客户端信任这些CA证书来签署ssl证书。此证书列表是您的信任存储。您的信任存储应该具有受信任CA的根和CA证书

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

这描述了单向身份验证。但是,如果您的应用程序需要相互身份验证,那么除了客户端对服务器进行身份验证外,服务器还需要对客户端进行身份验证。过程完全相同,但相反。客户端还需要一个ssl证书,服务器还需要一个信任存储,其中包含签署客户端证书的根/CA证书。服务器对客户端进行身份验证时适用相同的规则。因此,如果客户端的ssl证书过期,并且服务器的信任存储不知道新证书,则必须使用新CA的证书更新信任存储


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

它与CA一样安全。如果Java
cacerts
文件已信任CA,则您甚至不必在客户端安装CA证书。这是通常的做法。