为什么我的RMI/SSL客户端身份验证不起作用?

Wor*_*ase 0 java security ssl rmi

我做了以下事情:

+ generate keystore.jks with keytool
+ exported keystore.cer file with keytool
+ imported keystore.cer file into truststore.jks
+ copied keystore.jks and keystore.cer to the client
Run Code Online (Sandbox Code Playgroud)

然后我打电话给我的服务器

-Djavax.net.ssl.trustStore=truststore.jks -Djavax.net.ssl.trustStorePassword=*
Run Code Online (Sandbox Code Playgroud)

和我的客户

 -Djavax.net.ssl.keyStore=forclient.jks -Djavax.net.ssl.keyStorePassword=*
Run Code Online (Sandbox Code Playgroud)

服务器使用UnicastRemoteObject的super()调用公开其接口

super(PORT,
          new SslRMIClientSocketFactory(),
          new SslRMIServerSocketFactory(null, null, true));
Run Code Online (Sandbox Code Playgroud)

注册表内容不使用任何SSL.为什么这不起作用?如果我在服务器运行配置中添加密钥库VM参数,并在clien中添加trustore VM参数,那么它可以解决问题.但我真的想知道为什么?

San*_*osh 5

请先了解密钥库和信任库的目的.看看POST.它说

  • 密钥库包含私钥,证书及其对应的公钥.

  • 信任库包含您希望与之通信的其他方的证书,或来自您信任的用于标识其他方的证书颁发机构的证书.

因此客户端应该有信任库,以便它信任与其交互的服务器使用服务器的公钥来加密数据.服务器应该有密钥库,它存储私钥,用于解密客户端通过相应私钥加密的数据.

我希望你现在知道在客户端 - 服务器中切换密钥库和信任库时你的应用程序工作原理.