【问题标题】:Java adding multiple trust stores, one per portJava 添加多个信任库,每个端口一个
【发布时间】:2013-01-10 18:48:59
【问题描述】:

我有一个客户端/服务器进程,其中一台服务器和一台客户端。

连接设置如下:

System.setProperty("javax.net.ssl.trustStore", "path/to/store"); 
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
sslsocket = (SSLSocket) sslsocketfactory.createSocket(InetAddress.getLocalHost(), port); 

1:1,这很好用。现在我正在扩展它,以便服务器正在侦听多个客户端的多个端口。每个连接到服务器的客户端都应该在具有特定信任库的特定端口上执行此操作。

如果我在服务器端注册了两个信任库,当我尝试建立客户端连接时,我会收到错误:

javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown Received fatal alert: certificate_unknown

我一直在查看stack overflow 的示例,但一切似乎都过于复杂。有没有一种简单的方法来管理这个?还是一个进程不应使用多个密钥存储的令人信服的理由?

【问题讨论】:

  • 为什么?证书要么受信任,要么不受信任。ports 与它无关。听起来好像您正在尝试使用身份验证作为强制授权的一种手段,不同的端口具有不同的授权要求。这不是 PKI 身份验证的用途。
  • 你说得对,我希望每个客户端都能够使用不同的密钥库和密码进行连接,以使两个客户端尽可能分开。也许某种授权设置会更合适

标签: java ssl client-server keystore


【解决方案1】:

我认为使用您的方法是不可能的。由于您正在设置系统属性(这是一个哈希表),因此您编写的最后一个将覆盖之前的。

但是,我也不理解用例。一般来说,信任库是一个客户端概念。这是关于确定要信任的服务器。大多数时候(除非您使用基于证书的身份验证)客户端的可信度是不相关的。

话虽如此,可以为不同的端口设置不同的密钥库。以tomcat为例

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
       maxThreads="150" scheme="https" secure="true"
       keystoreFile="${user.home}/.keystore1"
       keystorePass="changeit"
       clientAuth="false" sslProtocol="TLS" />

上面的 sn-p 声明应该在端口 443 ~/.keystore1 上使用。在另一个端口上,可以使用 keystore2。

如果您想使用客户端身份验证,您可以强制客户端发送证书,在上面的示例中通过将 clientAuth 设置为 true,并添加 truststoreFile 和 truststorePass。

挖掘 tomcat 的源代码可能会帮助您设置环境。特别是文件 java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java 可能正是你想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 2015-12-14
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多