密码套件在客户端和服务器之间的通信使用TLS协议
问题描述:
我不是很熟悉的密码既不SSL/TLS协议,虽然我通过JSSE参考指南去了。我正在研究一个需要TCP连接安全性的项目,所以我选择了TLS作为最常用的协议来使用。密码套件在客户端和服务器之间的通信使用TLS协议
我发现的SSLSocket和SSLServerSocket的一段代码在JSSE参考指南,并在我的项目复制,但这一行动的结果是不是真的预期。当我开始我的服务器(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) {
}
答
你可能没有一个服务器证书。您没有明确创建SSLContext
,因此您的服务器访问证书和私钥的唯一方法是如果您在运行程序时设置了某些系统属性。没有必要的密钥材料,服务器只能启用匿名密码套件。
客户端,默认情况下,禁用这些匿名加密套件,因为它们实际上并不提供任何安全性。所以,握手失败,因为没有共同的密码套件。
服务器禁用它们。因此,如果没有证书,服务器将启用* no *密码套件。 – EJP
我如何启用它们? –