【问题标题】:How SSL works in case of self signed certificates in Java在 Java 中使用自签名证书时 SSL 如何工作
【发布时间】:2015-03-05 16:58:09
【问题描述】:

我正在开发一项 HTTPS 服务,该服务将部署在具有自签名证书的服务器和一个接受所有证书的客户端上。我是 SSL 新手。

我已经通过this postthis post 了解了如何配置信任管理器以接受所有证书。

如果我理解正确,java 客户端将使用服务器的公钥(通过使用服务器的公共证书安装)来加密要发送到服务器的数据。然后服务器使用它的私钥来解密数据。

我的问题是:

1.在一个常见的场景中,我们将server.cer安装在客户端机器的信任库中(java中的cacerts)。 java 客户端代码如何链接到这个已安装的公钥以在与此类服务器通信时加密数据?谁在这里进行 SSL 加密?是 Java API 做的还是我必须在将数据发送到服务器之前在客户端代码中处理加密?

2.如上述帖子之一所述,我们可以让客户端接受所有证书。在这种情况下加密和解密将如何工作?由于我们没有在客户端的信任库中安装任何服务器特定的密钥,客户端如何知道使用哪个公钥进行加密?

我正在寻找更多技术细节。

【问题讨论】:

    标签: java ssl https x509certificate


    【解决方案1】:

    我正在开发一项 HTTPS 服务,该服务将部署在具有自签名证书的服务器和接受所有证书的客户端上。我是 SSL 新手。

    很明显。你正在一个不安全的系统上工作。这是浪费时间。您可能根本不使用 SSL。客户端应接受 证书和所有 CA 证书,而不是所有证书。如前所述,您的系统容易受到中间人攻击。

    如果我理解正确,java 客户端将使用服务器的公钥(通过使用服务器的公共证书安装)来加密要发送到服务器的数据。

    你没有。它没有。证书用于验证服务器的身份,但 SSL 加密是通过秘密协商的会话密钥进行对称加密的,与证书中的公钥无关。

    然后服务器使用它的私钥解密数据。

    没有。

    java 客户端代码如何链接到此安装的公钥以在与此类服务器通信时加密数据?

    通常通过javax.net.ssl.trustStore 属性,但同样它不会将其用于加密,仅用于身份验证。

    谁在这里进行 SSL 加密?是 Java API 做的吗

    是的。它由HttpsURLConnection 使用javax.net.ssl.SSLSocket. 完成

    或者在将数据发送到服务器之前,我是否必须在客户端代码中处理加密?

    没有。

    正如上述帖子之一,我们可以让客户接受所有证书。

    你可以,但它根本不安全,永远不应该这样做。

    在这种情况下加密和解密将如何工作?由于我们没有在客户端的信任库中安装任何服务器特定的密钥,客户端如何知道使用哪个公钥进行加密?

    见上文,您在这里有一个误解,但是当您接受所有证书时,您不知道自己在与谁交谈,因此无论如何任何加密都是完全没有意义的。不要这样做。

    【讨论】:

    • 谢谢。我明白它不是用于加密的公钥。我的意思是它将使用公钥来加密要交换的密钥。如果我们没有公钥,客户端如何加密与服务器协商的密钥?
    • 这也是错误的。会话密钥根本不会交换。它由双方通过密钥协商协议独立协商。
    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 2021-07-28
    • 2011-03-15
    • 2012-11-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多