Java SSL套接字 - 客户端证书证明

时间:2018-04-21 13:09:26

标签: java sockets ssl certificate jsse

我正在尝试创建一个java SSL套接字客户端应用程序将连接到的Java SSL套接字服务器应用程序。为了保证两个沟通合作伙伴的可信赖性,

(1)如果客户端的证书是使用服务器的私钥签名的,服务器应该只接受客户端连接

(2)如果服务器的证书包含在客户的可信商店中,客户端应该只与服务器通信。

因为我对JSSE完全不熟悉,所以我只管理客户端应用程序,如果其证书包含在客户端的可信任存储中,则仅连接到服务器(条件2)。但是,我不知道如何实现我的第一个条件...

我会感激各种帮助。

最好的问候,Galveston01

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您要问的是如何启用双向SSL / TLS。这要求客户端验证服务器证书(问题中的第2点)和服务器以验证客户端证书 - 称为客户端身份验证(第1点)。

听起来你有“常规”单向TLS工作。我假设您自己创建并签署了服务器证书(也称为自签名证书),这就是您必须将服务器证书本身导入客户端信任库的原因 - 没有使用过的CA根/中间证书用它签名。

要启用客户端身份验证(第1点),您需要做两件事:

  1. 确保客户端证书位于服务器的信任库中(如前所述,如果是自签名证书,那么您需要将根/中间证书导入服务器truststore,无需导入证书本身)。由于您已经在客户端进行了此过程,因此不会产生任何问题。

  2. 在服务器上配置JSSE以启用客户端身份验证。为此,您需要设置以下属性:

    SSLServerSocket.setNeedClientAuth(真)

  3. 假设服务器上的信任库包含您的自签名客户端证书,并且客户端上的信任库包含您的自签名服务器证书,那么这应该可以。

    如果您没有使用自签名证书,但实际上可以访问测试CA或使用真正签名的证书(没有理由不使用letsencrypt),那么您可能希望查看这些SO的答案和评论问题:

    client not sending certificate for client authentication in TLS

    client auth failing for two way TLS

答案 1 :(得分:0)

JSSE 支持两个KeyManagerFactoryTrustManagerFacory类,以支持服务器端和客户端身份验证。

客户端填充TrustManagerFactory的信息,而服务器填充keyManagerFactory的信息。 服务器在连接客户端请求时填充如下所示的参数:

final KeyManagerFactory kmf = KeyManagerFactory.getInstance(ksAlgorithm);
  kmf.init(ks, password.toCharArray());

用于连接的客户端代码:

final TrustManagerFactory tmf = TrustManagerFactory.getInstance(ksAlgorithm);
tmf.init((KeyStore) null);