【问题标题】:Why is my RMI/SSL client authentication not working?为什么我的 RMI/SSL 客户端身份验证不起作用?
【发布时间】:2011-10-06 04:25:36
【问题描述】:

我做了以下事情:

+ 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

然后我调用我的服务器

-Djavax.net.ssl.trustStore=truststore.jks -Djavax.net.ssl.trustStorePassword=*

和我的客户

 -Djavax.net.ssl.keyStore=forclient.jks -Djavax.net.ssl.keyStorePassword=*

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

super(PORT,
          new SslRMIClientSocketFactory(),
          new SslRMIServerSocketFactory(null, null, true));

注册表的东西不使用任何 SSL。为什么这行不通? 如果我在服务器运行配置中添加密钥库 VM 参数并在客户端中添加信任库 VM 参数,它确实有效。但我真的很想知道为什么?

【问题讨论】:

标签: java security ssl rmi


【解决方案1】:

请先了解 keystore 和 truststore 的目的。看看POST。它说

  • 密钥库包含私钥,以及带有相应公钥的证书。

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

所以客户端应该有信任库,这样它就信任与它交互的服务器,它使用服务器的公钥来加密数据。服务器应该有 keystore 存储私钥,用于解密客户端通过相应私钥加密的数据。

我希望你现在明白为什么当你在客户端-服务器中切换 keystore 和 trustore 时你的应用程序可以工作。

【讨论】:

  • 对于客户端身份验证,也需要其他方式(最好使用其他密钥)。 (我不确定 Java 是否支持这一点,以及如何启用它。)
  • 是的,这是两种身份验证方式,即客户端验证服务器(通常是这种情况)和服务器验证客户端。
  • 但问题是我不需要服务器身份验证,那为什么我需要客户端的信任库?
  • @WorstCase:我认为服务器身份验证对于 SSL 来说并不是真正可选的。
  • @Paŭlo Ebermann +1 但更准确地说,必须至少对其中一个对等方进行身份验证才能确保 SSL 安全。您始终可以翻转握手,以便客户端是用于握手目的的服务器,因此(真正的)客户端是经过身份验证的对等方。但是,这些套接字工厂无法做到这一点。
猜你喜欢
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2014-09-15
  • 2014-11-13
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多