Java 使用TLS协议的客户端和服务器之间通信中的密码套件
我对加密和SSL/TLS协议都不是很熟悉,尽管我阅读了JSSE参考指南。我正在从事一个项目,该项目要求TCP连接具有某种安全性,因此我选择TLS作为最常用的协议 我在JSSE参考指南中找到了SSLSocket和SSLServerSocket的代码片段,并将其复制到我的项目中,但该操作的结果并不是预期的。当我启动服务器(Java应用程序)时,一切似乎都正常工作,我试图与客户机(也是Java应用程序)连接。此时,SSLHandshakeException发生:没有共同的密码套件。 我的问题是,什么通常是密码套件(我在谷歌上搜索了它,但我并不真正理解,我需要的是对初学者的基本解释)以及我必须如何修复下面给出的代码,才能使我的项目完美地工作 SSLSocket:Java 使用TLS协议的客户端和服务器之间通信中的密码套件,java,ssl,tls1.2,Java,Ssl,Tls1.2,我对加密和SSL/TLS协议都不是很熟悉,尽管我阅读了JSSE参考指南。我正在从事一个项目,该项目要求TCP连接具有某种安全性,因此我选择TLS作为最常用的协议 我在JSSE参考指南中找到了SSLSocket和SSLServerSocket的代码片段,并将其复制到我的项目中,但该操作的结果并不是预期的。当我启动服务器(Java应用程序)时,一切似乎都正常工作,我试图与客户机(也是Java应用程序)连接。此时,SSLHandshakeException发生:没有共同的密码套件。 我的问题是,什么通
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
,因此服务器访问证书和私钥的唯一方法是在设置了某些系统属性的情况下运行程序。如果没有必要的密钥材料,服务器将只启用匿名密码套件
默认情况下,客户端禁用这些匿名密码套件,因为它们实际上不提供任何安全性。因此,握手失败,因为没有共同的密码套件。服务器也会禁用它们。因此,如果没有证书,服务器不会启用密码套件。如何启用它们?