使用TLS协议在客户端和服务器之间进行通信的密码套件

时间:2017-02-16 23:33:26

标签: java ssl tls1.2

虽然我浏览了JSSE参考指南,但我对SSL / TLS协议的密码学并不是很熟悉。我正在开发一个项目,要求通过TCP连接提供某种安全性,所以我选择TLS作为最常用的协议。

我在JSSE参考指南中找到了SSLSocket和SSLServerSocket的代码片段并将其复制到我的项目中,但该操作的结果并不是真正的预期。当我启动我的服务器(Java应用程序)时,一切似乎工作到我试图连接客户端(也是Java应用程序)。此时,发生 SSLHandshakeException 没有共同的密码套件。

我的问题是,通常是一个密码套件(我用Google搜索但我并不理解,初学者的基本解释是我需要的)以及我必须如何修复下面给出的代码让我的项目完美无瑕地运作?

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) {
}

1 个答案:

答案 0 :(得分:1)

您可能没有服务器证书。您没有显式创建SSLContext,因此服务器访问证书和私钥的唯一方法是运行具有某些系统属性集的程序。如果没有必要的密钥材料,服务器将只启用匿名密码套件。

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