【问题标题】:SSL - only allow specific clients or servers (Java truststore)SSL - 只允许特定的客户端或服务器(Java 信任库)
【发布时间】:2013-11-23 06:14:12
【问题描述】:

如果信任库应该只包含根 CA 证书(这似乎是我所阅读的建议),您如何限制对特定方的访问(而不是信任库中由 CA 验证的任何一方)。

更多详情:

我有两个 java 应用程序——我们称它们为 A 和 B——它们使用 SSL 来保护通信。 A 和 B 都有一个客户端和服务器部分来发送(客户端)和接收(服务器)消息。客户端使用存储在 client.keystore 中的密钥,服务器使用存储在 server.keystore 中的密钥,并且两者都使用单个信任库来验证另一个应用程序的身份(即应用程序 A 有 3 个密钥库,应用程序 B 有 3 个密钥库) .

到目前为止,我已经使用 keytools 为客户端和服务器生成密钥,对它们进行签名(使用我自己的测试 CA),并将签名证书加载回密钥库。我为应用程序 A 和 B 执行此操作。为了完成 SSL 握手,我发现信任库需要包含用于签署其他应用程序密钥的 CA 证书(因此应用程序 A 的信任库必须包含 CA 证书用于签署应用 B 的客户端和服务器密钥,反之亦然)。

到目前为止,这是有道理的,但是因为信任存储包含根 CA 证书,我可以生成另一组密钥,使用相同的 CA 对它们进行签名,并让它们被其他应用程序接受 - 换句话说,应用程序 B 将接受一个看起来像应用 A 的恶意代理,只要它具有由根 CA 签名的密钥。

SSL 是否有防止这种情况发生的机制?我尝试将应用 A 的客户端和服务器的公钥导入应用 B 的信任库(反之亦然),但如果没有根证书,SSL 握手将无法完成。

【问题讨论】:

    标签: java ssl keytool


    【解决方案1】:

    SSL 是否有防止这种情况发生的机制?

    没有。 SSL 提供隐私、完整性和身份验证。同龄人就是他们所说的那样。你在谈论的是授权:这个对等点是我想与之交谈的对等点吗?这是应用程序的责任。您可以通过SSLSocket.getSession() 获取对等证书链,并在握手期间通过HandshakeCompletedListener 对其进行检查以授权对等。如果您不喜欢他,请关闭插座。连接上不会发生任何其他事情。

    【讨论】:

    • 你的意思是授权就是他所说的对吧?
    • @George 谢谢,确实如此。
    猜你喜欢
    • 2012-07-06
    • 2016-10-24
    • 2023-03-21
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2013-08-05
    相关资源
    最近更新 更多