Сбой SSL Handshake с клиентом и сервером
Поэтому я создаю клиент на 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.SSL HandshakeException: нет общих шифров
И следующее в Python:
ОШИБКА [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] Ошибка квитирования оповещения sslv3 (_ssl.c:645)
Любая помощь будет принята с благодарностью.
Спасибо
2 ответа
javax.net.ssl.SSLHandshakeException: нет общих шифров
Это означает, что сервер поддерживает только те шифры, которые не поддерживает клиент, то есть нет перекрытия и, следовательно, нет общего шифра, который можно использовать для аутентификации и шифрования.
Исходя из исходного кода вашего сервера, я предполагаю, что вы пропустили настройку сертификата, который должен использовать сервер. В этом случае может быть выполнена только анонимная аутентификация, и шифры для этого обычно не включены в клиентах SSL (а также не в браузере).
SSLV3 устарел из-за недостатков безопасности. Ваш клиент пытается использовать протокол SSLV3, а сервер его даже не распознает.
Вы также можете:
- Настройте сервер для разрешения SSLV3 (не то, что я бы порекомендовал)
- Сконфигурируйте ваш сокет в вашем клиенте python, чтобы явно не использовать какой-либо протокол, основанный на SSLV3. Вы можете использовать вместо TLS. Обычно вы хотите сделать это путем переопределения используемого SocketFactory.
В мире Java эта проблема возникает при использовании клиента в Java 1.6. Java 1.7 удалила использование SSLV3Hello по умолчанию.