Сбой 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 по умолчанию.

Другие вопросы по тегам