Шифрование сообщений SSL - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь построить сервер SSL под Python 3.4. Суть в том, чтобы обмениваться данными и обмениваться данными с программой через определенный протокол, основанный на формате данных JSON.

Поэтому я использовал базовый c «эхо-сервер» и клиента в протоколе SSL и изменил их так, чтобы посмотрим, смогу ли я обмениваться данными. Это сработало, и отправка "привет" с одной стороны, как b "привет" с другой стороны, и это работает в обе стороны.

Я запускаю серверную часть, подключаю программу, она успешно общается, но: я ожидаю что-то вроде: LOGIN:n::{“user”:”XXXXX”, , ”password”:”YYYYY ”, app”:”ZZZZZ”, “app_ver”:”zzz”, ”protocol”:”xxx”,”protocol_ver”:”xxxx”} приходит от клиента (программы)

Но вместо этого я получаю что-то вроде этого b"\x16\x03\x03\x00\x8e\x01\x00\x00\x8a\x03\x03^\x9e\xeb\xd8\x8f\xd9 \x05v\xbbF:}\xda\x17\xf7\x13\xff\xa9\xde=5\xfb_\xbco\x16\x96EL#\x00\x00*\xc0,\xc0+\xc00\xc0/\x00\x9f\x00\x9e\xc0$\xc0#\xc0(\xc0'\xc0\n\xc0\t\xc0\x14\xc0\x13\x00\x9d\x00\x9c\x00=\x00<\x005\x00/\x00\n\x01\x00\x007\x00\n\x00\x08\x00\x06\x00\x1d\x00\x17\x00\x18\x00\x0b\x00\x02\x01\x00\x00\r\x00\x14\x00\x12\x06\x01\x06\x03\x04\x01\x05\x01\x02\x01\x04\x03\x05\x03\x02\x03\x02\x02\x00#\x00\x00\x00\x17\x00\x00\xff\x01\x00\x01\x00"

Я думал, что это просто закодировано, но я попробовал bytemessage.decode() метод с utf-8, cp437, cp1250, cp1252, латиница-1 и др. c. Я также попытался codecs.decode () с шестнадцатеричным. Безуспешно, я не понимаю, что это за язык.

Я новичок в SSL, поэтому я полагаю, что мне здесь не хватает чего-то очевидного, но я понятия не имею, что ...

Любая помощь будет с благодарностью.

Заранее спасибо!

---- Редактируйте здесь код моего сервера -----

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 5000)
print ('starting up on %s port %s' % server_address)
sock.bind(server_address)
sock.listen(1)

while True:
     print ( 'waiting for a connection')
     connection, client_address = sock.accept();
     try:
        print( 'connection from', client_address)
        while True:
            data = connection.recv(16)
            print ( 'received "%s"' % data)
            if True:
                 #data2=b'{"timing":{"liveEvents": {"sector": {"dayTime": 1483523892618,"driver": 1,"isValid": false,"participant": "0","sector": 3,"time": -1}}}}'
                 print ('sending data to the client')
                 #connection.sendall(data2)
            else:
                print ( 'no more data from', client_address)
                break

     finally:
        connection.close()

Ответы [ 2 ]

1 голос
/ 21 апреля 2020
b"\x16\x03\x03...

Это сообщение TLS. Похоже, ваш клиент пытается передать TLS на ваш сервер, но ваш сервер не может правильно обработать его. Вместо того, чтобы обрабатывать данные как TLS, предполагается, что TLS - это фактические данные приложения.

Глядя на код вашего сервера, причина ясна: вы не используете там никакой SSL, т.е. вы делаете простой TCP-сокет. SSL не будет магически появляться только потому, что клиенты пытаются общаться SSL с сервером, но вам нужно правильно использовать модуль ssl wrap_socket и предоставить необходимый сертификат и ключ сервера. Для простого примера см. документацию .

0 голосов
/ 21 апреля 2020

Как упоминал @Steffen, я вообще не работал с SSL, что я сейчас делаю с ssl.wrap_socket(sock,certfile='certificat.pem', keyfile='cle.pem', server_side=True)

Для работы на стороне сервера требуются сертификаты и файлы ключей в pem, которые я сгенерировал с помощью SelfSSL7, а затем разделить pfx на 2 ключа pem и файлы сертификатов с помощью OpenSSL

openssl pkcs12 -in yourpfxfile.pfx -nocerts -out privatekey.pem -nodes openssl pkcs12 -in yourpfxfile.pfx -nokeys -out publiccert.pem -nodes

Возможно, это не самое быстрое решение для самозаверяющего сертификата, поскольку у меня теперь установлен OpenSSL, но…

Наконец, ожидаемое сообщение !!

starting up on localhost port 11000
waiting for a connection
connection from ('127.0.0.1', 60488)
received "b'PING:0::\r\n'"
sending data to the client
received "b'LOGIN:::{"user":"test","password":"test","app":"AppName","app_ver":"1.0.0","protocol":" ","protocol_ver":"1.0.0"}\r\n'"
sending data to the client

Еще раз большое спасибо @ SteffenUllrich

...