我有一个通过SSLSockets发送数据的客户端/服务器应用程序,所以我生成了一个证书,并将其与信任存储和密钥存储一起加载。客户端将是公共的,因此为了工作,我需要客户端具有javaTrustStore.jts文件。是否可以将其捆绑到资源目录中?或者我应该让客户端每次都生成一个新密钥,并将其添加到服务器的密钥存储中?
b09cbbtk1#
有两种方法可以解决这个问题。第一种是只在服务器上有证书,而在客户端上没有证书。这是网站工作的通常方式-当SSL连接被协商时,服务器将其证书发送到客户端,客户端验证服务器证书是否由客户端信任的Certificate Authority签名。大多数(所有?)Web浏览器都预载了一些证书颁发机构的“主证书”,因此,在此模式下运行的Java应用程序需要“主CA证书”,以及其信任存储区中的任何“中间”签名证书。你也可以是你自己的CA,这在过去的几年里是经常做的,那时你必须为服务器证书付费。现在,如果你想要一个免费的证书,你可以使用Let's Encrypt,或者其他几个免费证书提供商之一。如果在协商SSL连接时需要验证客户端,那么您也需要在客户端上放置一个证书。但是,您不能让客户端生成自己的证书。您需要让您的CA生成并签署证书,然后将证书提供给客户端,客户端需要将证书添加到他们的密钥库中。同样,在这种情况下,您可以充当自己的CA,并生成“自签名”证书。如果你想看一个例子,大约九到十年前,我为我雇主的网站写了一个blog post,关于用Android应用程序做这个。
1条答案
按热度按时间b09cbbtk1#
有两种方法可以解决这个问题。
第一种是只在服务器上有证书,而在客户端上没有证书。
这是网站工作的通常方式-当SSL连接被协商时,服务器将其证书发送到客户端,客户端验证服务器证书是否由客户端信任的Certificate Authority签名。大多数(所有?)Web浏览器都预载了一些证书颁发机构的“主证书”,
因此,在此模式下运行的Java应用程序需要“主CA证书”,以及其信任存储区中的任何“中间”签名证书。
你也可以是你自己的CA,这在过去的几年里是经常做的,那时你必须为服务器证书付费。现在,如果你想要一个免费的证书,你可以使用Let's Encrypt,或者其他几个免费证书提供商之一。
如果在协商SSL连接时需要验证客户端,那么您也需要在客户端上放置一个证书。但是,您不能让客户端生成自己的证书。您需要让您的CA生成并签署证书,然后将证书提供给客户端,客户端需要将证书添加到他们的密钥库中。
同样,在这种情况下,您可以充当自己的CA,并生成“自签名”证书。
如果你想看一个例子,大约九到十年前,我为我雇主的网站写了一个blog post,关于用Android应用程序做这个。