2016-05-26 1 views
1

Итак, я создаю клиент на Python и сервер на Java для обмена и передачи файлов и строк. Я думаю, что первое, что мне нужно было сделать (помимо подключения к серверу и клиенту), - это завершение SSL Handshake. Ниже мой клиентский код Python и код сервера Java, который я реализовал:Ошибки установления связи SSL с клиентом и сервером

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: нет общих шифров

И следующее питона:

ERROR [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] SSLv3 оповещения недостаточность рукопожатия (_ssl.c: 645)

Любые и вся помощь будет высоко оценена.

Благодаря

ответ

0

javax.net.ssl.SSLHandshakeException: нет шифра костюмов в общем

Это означает, что сервер поддерживает только шифрует клиент не поддерживает, т.е. без дублирования и, таким образом, нет общий шифр, который может использоваться для аутентификации и шифрования.

Учитывая исходный код вашего сервера, я предполагаю, что вы пропустили настройку сертификата, который должен использовать сервер. В этом случае может быть выполнена только анонимная аутентификация, а шифры для этого обычно не включены в SSL-клиентах (а также не в браузере).

+0

Благодарим за помощь! А я вижу. Хорошо, поэтому мне нужно настроить сертификат, который должен использовать сервер, а затем как клиент подтвердит, что сертификат действителен? –

+0

@ D.Crusaf: Да, вы должны установить сертификат. Если клиент принимает это или нет, зависит от того, кто выдал сертификат, и если клиент доверяет этому эмитенту. Объяснение того, как работает TLS и как проверка сертификата выполняется более подробно, действительно выходит за рамки этого вопроса. Я рекомендую прочитать [Как работает SSL/TLS?] (Http://security.stackexchange.com/questions/20803/how-does-ssl-tls-work). –

+0

Большое спасибо! Я попытаюсь сделать сертификат для сервера. Спасибо за ссылку, очень ценю. –

0

SSLV3 устарел из-за недостатков в безопасности. Ваш клиент пытается использовать протокол SSLV3, пока сервер его даже не распознает.

Вы можете:

  • Настройка сервера, чтобы SSLv3 (не то, что я бы рекомендовал)
  • Настройте сокет в клиенте питона явно не использовать любой протокол, основанный на SSLv3. Вместо этого вы можете использовать TLS. Обычно вы хотите сделать это, переопределив используемую SocketFactory.

В мире Java у нас есть эта проблема при использовании клиента в java 1.6. Java 1.7 удалил использование SSLV3Hello по умолчанию.

+0

У меня самая обновленная версия Java, и мой клиент находится в Python. Я действительно не знаю, что такое Tomcat, но я просто использую свой cmd с несколькими сценариями, которые я написал. Я попытаюсь переопределить используемую SocketFactory! Спасибо! –

+0

Ты определенно прав о Томкате. Я слишком образован, забыл об этом. Я отредактирую свой ответ. В любом случае проблема остается прежней: клиент использует для подтверждения SSLV3, и сервер отказывается от него. Вы должны настроить клиент на использование TLS. –

+0

Хорошо, спасибо за вход. Я не совсем уверен, как использовать TLS, но я постараюсь изо всех сил разобраться в этом. Еще раз спасибо! –

Смежные вопросы