我有一个Java SSL服务器应用程序,并且能够使用自签名证书和密钥对与其客户端通信。这是在我的开发机器上完成的。
现在,是时候在实时服务器上启动应用程序了,我已经从授权机构(LE)获得了SSL证书。
我可以导出签名的证书,并将其导入到我的Android客户端的Bouncy Castle密钥库中。但是,有一件事让我开始思考。如果证书过期,则意味着我必须每次都更新应用程序。我不想这样做,感觉工作太多。
我正在阅读此page,他们提到(第 SSL密钥 ,项目编号 3 ), CA证书足以建立连接。
[可选地]导出您的私钥的公钥证书,然后 将其分发给将与您互动的SSL各方。 (看到 “从密钥库导出公共密钥证书”部分) 使用来自证书颁发机构的证书,那么它将 足以让其他人仅拥有证书的证书 权威本身。
我想知道它的安全性以及它的含义(如果有)。
该想法是避免每次证书更新时都重新编译客户端应用程序。
谢谢。
答案 0 :(得分:1)
根据我的收集,只有您的客户端在验证您的服务器,而不是相反。这是一种身份验证方式,因为两方中只有一方在对另一方进行身份验证。我可能错了,您可能正在进行相互认证,但是我们会解决的。首先,让我们考虑一下更简单的情况。
为了让您的客户端对您的服务器进行身份验证,服务器需要一个带有私钥的SSL证书,看起来像您拥有的那样。该证书由CA证书签名,而CA证书可能由Root证书签名。为了使您的客户端信任您的服务器,它需要客户端信任的用于签署ssl证书的CA证书列表。此证书列表是您的信任库。您的信任库应具有受信任CA的根目录和CA证书。
如果服务器的SSL证书过期,则需要为服务器获取新的证书。如果您的新证书是由与旧证书相同的CA签署的,则客户端将继续信任您的服务器,而不会进行任何更新。但是,如果新证书是由客户端未知的CA签名的(即CA证书不在信任库中),则需要使用CA和新证书的根证书来更新客户端的信任库。
这描述了一种身份验证方式。但是,如果您的应用程序需要双向身份验证,则除了客户端对服务器进行身份验证外,服务器还需要对客户端进行身份验证。过程完全相同,但是相反。客户端还将需要ssl证书,服务器也将需要带有签名客户端证书的Root / CA证书的信任库。适用与服务器验证客户端时相同的规则。因此,如果客户端的ssl证书过期且服务器的信任库不知道新证书,则必须使用新的CA证书来更新信任库。
一种解决方法,必须手动更新您的信任库是使用您信任的CA自动获取新的信任库。这就是您的浏览器所做的。但是,如果需要新证书,您仍然需要更新您的应用程序。