【问题标题】:Java SSL socket -- client certificate proofJava SSL 套接字——客户端证书证明
【发布时间】:2018-04-21 13:09:25
【问题描述】:

我正在尝试创建一个 Java SSL 套接字服务器应用程序,一些 Java SSL 套接字客户端应用程序将连接到该应用程序。为保证通信双方的可信度,

(1) 仅当客户端的证书使用服务器的私钥签名时,服务器才应接受客户端连接

(2) 仅当服务器的证书包含在客户端的受信任存储中时,客户端才应与服务器通信。

因为我是 JSSE 的新手,我只管理客户端应用程序连接到服务器,前提是它的证书包含在客户端的受信任存储中(条件 2)。但是,我不知道如何达到我的第一个条件......

我将不胜感激。

最好的问候,加尔维斯顿01

【问题讨论】:

  • 您需要在您的服务器的 SSL 配置中设置接受的 CA 证书。然后客户端将在握手期间收到接受的 CA 列表
  • 将单个证书用作服务器证书和 CA 证书是不寻常的,甚至是不可能的,但这就是您的问题所暗示的。您确定您了解您的要求吗?
  • 是的,这正是我最初想要的,但@0xadecimal 的解决方案对我来说也足够了。

标签: java sockets ssl certificate jsse


【解决方案1】:

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

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

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

  1. 确保客户端证书在服务器的信任库中(和以前一样,如果这不是自签名证书,那么您需要将根/中间证书导入服务器信任库,无需导入证书本身)。由于您已经在客户端完成了此过程,因此应该没有问题。

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

    SSLServerSocket.setNeedClientAuth(true)

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

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

client not sending certificate for client authentication in TLS

client auth failing for two way TLS

【讨论】:

  • @Galveston01 在那种情况下,您没有正确表达您的问题。这只是您可以在任何地方找到的双向 SSL 的通用解决方案。此答案中没有任何内容可以满足您对使用服务器私钥签署客户端证书的明确要求。相反,它是关于“自签名客户端证书[s]”。
  • 最初我只是希望服务器签署所有客户端证书,因此不需要服务器端的信任库(因为当客户端被授权时,服务器可以使用自己的公钥解密客户端的证书)。但我很幸运,它完全可以运行,所以我决定承担将所有客户端证书放在服务器端的信任库中的负担。所以是的,他的理解并不完全正确,但我很幸运有任何解决方案
  • @Galveston01 客户端证书未加密,因此无需解密。您提出的问题从来没有意义,并且您没有修改过,这个答案没有解决。
【解决方案2】:

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);

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 2012-02-15
    • 2012-03-27
    • 2013-08-04
    • 2015-08-07
    • 2017-06-18
    • 2010-10-16
    • 2017-04-28
    • 2012-08-25
    相关资源
    最近更新 更多