java - 使用 TLS 协议(protocol)在客户端和服务器之间通信的密码套件

标签 java ssl tls1.2

<分区>

虽然我阅读了 JSSE 引用指南,但我对密码学和 SSL/TLS 协议(protocol)都不是很熟悉。我正在从事一个项目,该项目需要通过 TCP 连接提供某种安全性,因此我选择 TLS 作为最常用的协议(protocol)。

我在 JSSE 引用指南中找到了 SSLSocket 和 SSLServerSocket 的代码段,并将其复制到我的项目中,但该操作的结果并不是我所期望的。当我启动我的服务器(Java 应用程序)时,一切似乎都正常到我尝试连接客户端(也是 Java 应用程序)的地步。那时,发生了 SSLHandshakeException:没有共同的密码套件。

我的问题是,什么是一般的密码套件(我用谷歌搜索了它,但我并没有真正理解,我需要的是对初学者的基本解释)以及我必须如何修复下面给出的代码让我的项目完美运行?

SSLSocket:

import java.io.*;
import javax.net.ssl.*;

. . .

int port = availablePortNumber;
String host = "hostname";

try {
    SSLSocketFactory sslFact =
        (SSLSocketFactory)SSLSocketFactory.getDefault();
    SSLSocket s = (SSLSocket)sslFact.createSocket(host, port);

    OutputStream out = s.getOutputStream();
    InputStream in = s.getInputStream();

    // Send messages to the server through
    // the OutputStream
    // Receive messages from the server
    // through the InputStream
}

catch (IOException e) {
}

SSLServerSocket:

 import java.io.*;
import javax.net.ssl.*;

. . .

int port = availablePortNumber;

SSLServerSocket s;

try {
    SSLServerSocketFactory sslSrvFact =
        (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
    s = (SSLServerSocket)sslSrvFact.createServerSocket(port);

    SSLSocket c = (SSLSocket)s.accept();

    OutputStream out = c.getOutputStream();
    InputStream in = c.getInputStream();

    // Send messages to the client through
    // the OutputStream
    // Receive messages from the client
    // through the InputStream
}

catch (IOException e) {
}

最佳答案

您可能没有服务器证书。您没有显式创建 SSLContext,因此您的服务器访问证书和私钥的唯一方法是在设置了特定系统属性的情况下运行您的程序。如果没有必要的 key Material ,服务器将只启用匿名密码套件。

默认情况下,客户端禁用这些匿名密码套件,因为它们实际上不提供任何安全性。因此,握手失败,因为没有共同的密码套件。

关于java - 使用 TLS 协议(protocol)在客户端和服务器之间通信的密码套件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286742/

上一篇:子域的 SSL 影响根域安全

下一篇:java - 无法连接到 Jetty 上运行的安全 Websocket

相关文章:

security - HTTPS 是否可以防止 session 骑马?

ssl - Curl 一直说 "SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure"但它应该是 TLS

powershell - 创建集群时如何指定指纹?

java - 从 CoreNLP 模型 jar 文件加载特定模型文件而不是其本地副本

java - 在 Java 中使用两个线程并从另一个线程控制一个线程?

java - 如何将一个对象克隆为Object类的对象?

java - 使用 Netty 的单向 SSL 身份验证

java - Swing:函数的执行顺序

Python + 自签名证书 + HTTP 不工作但在 C#、Java 中工作

ios - 我有一个 Objective-C iPad 应用程序,该应用程序发出如下失败的 Web 服务调用 :