客户端和服务器的 SSL 握手失败
SSL Handshake failures with client and server
所以我在 Python 上构建一个客户端,在 Java 上构建一个服务器来通信和传输文件和字符串。我在想我必须做的第一件事(除了连接服务器和客户端)是完成 SSL 握手。以下是我实现的 Python 客户端代码和 Java 服务器代码:
Python 客户端代码
import socket
import ssl
import struct
import io
import threading
import optparse
import os
import sys
HOST = "localhost"
PORT = 777
ADDR = (HOST,PORT)
def sock_connection():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
time.sleep(1)
ssl_sock = ssl.wrap_socket(sock)
try:
time.sleep(1)
ssl_sock.connect(ADDR)
print('CONNECTED!')
except socket.error as e:
print('ERROR', e)
exit(1)
return ssl_sock
def main():
sock_connection()
main()
Java 服务器代码:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
public
class Server {
private static final int PORT = 777;
public
static
void
main(String[] arstring) {
try {
SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =
(SSLServerSocket) sslserversocketfactory.createServerSocket(PORT);
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
InputStream inputstream = sslsocket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String string = null;
while ((string = bufferedreader.readLine()) != null) {
System.out.println(string);
System.out.flush();
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
我通常先 运行 服务器,这 运行 没问题,然后我 运行 客户端和我在服务器终端收到以下错误:
javax.net.ssl.SSLHandshakeException: 没有共同的密码套装
以及 python 中的以下内容:
错误 [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 警报握手失败 (_ssl.c:645)
我们将不胜感激任何帮助。
谢谢
javax.net.ssl.SSLHandshakeException: no cipher suits in common
这意味着服务器只支持客户端不支持的密码,即没有重叠,因此没有可用于身份验证和加密的通用密码。
鉴于您服务器的源代码,我猜测您没有设置服务器应使用的证书。在这种情况下,只能进行匿名身份验证,并且通常不会在 SSL 客户端(以及浏览器)中启用此密码。
SSLV3 由于安全漏洞已被弃用。您的客户端正在尝试使用 SSLV3 协议,而服务器甚至无法识别它。
您可以:
- 设置服务器以允许 SSLV3(我不推荐)
- 在您的 python 客户端中配置套接字以明确不使用任何基于 SSLV3 的协议。您可以改用 TLS。您通常希望通过覆盖所使用的 SocketFactory 来做到这一点。
在 Java 世界中,我们在 java 1.6 中使用客户端时遇到了这个问题。 Java 1.7 删除了 SSLV3Hello 的默认使用。
所以我在 Python 上构建一个客户端,在 Java 上构建一个服务器来通信和传输文件和字符串。我在想我必须做的第一件事(除了连接服务器和客户端)是完成 SSL 握手。以下是我实现的 Python 客户端代码和 Java 服务器代码:
Python 客户端代码
import socket
import ssl
import struct
import io
import threading
import optparse
import os
import sys
HOST = "localhost"
PORT = 777
ADDR = (HOST,PORT)
def sock_connection():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
time.sleep(1)
ssl_sock = ssl.wrap_socket(sock)
try:
time.sleep(1)
ssl_sock.connect(ADDR)
print('CONNECTED!')
except socket.error as e:
print('ERROR', e)
exit(1)
return ssl_sock
def main():
sock_connection()
main()
Java 服务器代码:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
public
class Server {
private static final int PORT = 777;
public
static
void
main(String[] arstring) {
try {
SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =
(SSLServerSocket) sslserversocketfactory.createServerSocket(PORT);
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
InputStream inputstream = sslsocket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String string = null;
while ((string = bufferedreader.readLine()) != null) {
System.out.println(string);
System.out.flush();
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
我通常先 运行 服务器,这 运行 没问题,然后我 运行 客户端和我在服务器终端收到以下错误:
javax.net.ssl.SSLHandshakeException: 没有共同的密码套装
以及 python 中的以下内容:
错误 [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 警报握手失败 (_ssl.c:645)
我们将不胜感激任何帮助。
谢谢
javax.net.ssl.SSLHandshakeException: no cipher suits in common
这意味着服务器只支持客户端不支持的密码,即没有重叠,因此没有可用于身份验证和加密的通用密码。
鉴于您服务器的源代码,我猜测您没有设置服务器应使用的证书。在这种情况下,只能进行匿名身份验证,并且通常不会在 SSL 客户端(以及浏览器)中启用此密码。
SSLV3 由于安全漏洞已被弃用。您的客户端正在尝试使用 SSLV3 协议,而服务器甚至无法识别它。
您可以:
- 设置服务器以允许 SSLV3(我不推荐)
- 在您的 python 客户端中配置套接字以明确不使用任何基于 SSLV3 的协议。您可以改用 TLS。您通常希望通过覆盖所使用的 SocketFactory 来做到这一点。
在 Java 世界中,我们在 java 1.6 中使用客户端时遇到了这个问题。 Java 1.7 删除了 SSLV3Hello 的默认使用。