проблема при попытке соединить сервер с клиентом через сокеты SSL - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь соединить сервер и клиент через SSL. Я смог сделать это через небезопасный сокет, но теперь, когда я добавляю в SSL, мне кажется, что я путаю процесс рукопожатия.Мой сервер загружается правильно, но когда я загружаю свой клиент, я получаю сообщение об ошибке:

[X509: KEY_VALUES_MISMATCH] несоответствие значений ключей (_ssl.c: 3845)

Я попытался переключить файлы, загруженные вСценарии Python вокруг нашли несколько более простых решений, которые не работали.Я чувствую, что я очень близок, но я делаю что-то не так ..

Это сценарии bash, которые загружают openSSL, а затем загружают сценарии python:

startServer.sh

#!/bin/bash

BOLD=$(tput bold)
CLEAR=$(tput sgr0)

echo -e "${BOLD}Generating RSA AES-256 Private Key for Root Certificate Authority${CLEAR}"
openssl genrsa -aes256 -out root.key 4096

echo -e "${BOLD}Generating Certificate for Root Certificate Authority${CLEAR}"
openssl req -x509 -new -nodes -key root.key -sha256 -days 1825 -out root.pem

echo -e "${BOLD}Generating RSA Private Key for Server Certificate${CLEAR}"
openssl genrsa -out server.key 4096

echo -e "${BOLD}Generating Certificate Signing Request for Server Certificate${CLEAR}"
openssl req -new -key server.key -out server.csr

echo -e "${BOLD}Generating Certificate for Server Certificate${CLEAR}"
openssl x509 -req -in server.csr -CA root.pem -CAkey root.key -CAcreateserial -out server.crt -days 1825 -sha256 -extfile server.ext

openssl verify -verbose -CAfile root.pem server.crt

python3 socketserv.py "$@"

startClient.sh

#!/bin/bash

BOLD=$(tput bold)
CLEAR=$(tput sgr0)

echo -e "${BOLD}Generating RSA Private Key for Client Certificate${CLEAR}"
openssl genrsa -out client.key 4096

echo -e "${BOLD}Generating Certificate Signing Request for Client Certificate${CLEAR}"
openssl req -new -key client.key -out client.csr

echo -e "${BOLD}Generating Certificate for Client Certificate${CLEAR}"
openssl x509 -req -in client.csr -CA root.pem -CAkey root.key -CAcreateserial -out client.crt -days 1825 -sha256

openssl verify -verbose -CAfile root.pem client.crt

python3 socketclient.py "$@"

Это фрагмент кода из сценариев Python для сервера и клиента, применимых к рукопожатию SSL.

socketServer.py

def Main():
#attempts to connect through given port
    try:
        build_exe_options = {"include_files":[(requests.certs.where(),'cacert.pem')]}
        inputArgs = sys.argv[1:]
    except Exception as e:
        print(e)
        exit()
    try:
        host = "" 
        port = int(inputArgs[0])
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server_socket.bind((host, port))
    #if port does not work an exception is thrown and program exits
    except Exception as e:
        print(e)
        print("Error, try again")
        exit()
    print("socket binded to post", port) 
    # put the socket into listening mode 
    server_socket.listen(10)
    # a forever loop until client wants to exit
    while True: 
        # establish connection with client 
        client, fromaddr = server_socket.accept()
        secure_sock = ssl.wrap_socket(client, server_side=True, ca_certs = "client.crt", certfile="server.crt", keyfile="server.key", cert_reqs=ssl.CERT_REQUIRED,
                           ssl_version=ssl.PROTOCOL_TLSv1_2)
        print(repr(secure_sock.getpeername()))
        print(secure_sock.cipher())
        print(pprint.pformat(secure_sock.getpeercert()))
        cert = secure_sock.getpeercert()
        print(cert)

        # verify client
        if not cert or ('commonName', 'test') not in cert['subject'][3]: raise Exception("ERROR")

        print('Connected to :', fromaddr[0], ':', fromaddr[1])
        # Start a new thread and return its identifier 
        start_new_thread(threaded, (client,))
    server_socket.close()

socketClient.py

def Main():
    try:
        inputArgs = sys.argv[1:]
        host = inputArgs[0]  # The server's hostname or IP address
        port = int(inputArgs[1])   # The port used by the server
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.setblocking(1);
        # connect to server on local computer 
        s.connect((host,port))
        context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
        context.verify_mode = ssl.CERT_REQUIRED
        context.load_verify_locations('server.crt')
        context.load_cert_chain(certfile="server.crt", keyfile="client.key")

        if ssl.HAS_SNI:
            secure_sock = context.wrap_socket(s, server_side=False, server_hostname=host)
        else:
            secure_sock = context.wrap_socket(s, server_side=False)
        cert = secure_sock.getpeercert()
        print (cert)
        if not cert or ('commonName', 'test') not in cert['subject'][3]: raise Exception("ERROR")
        s = secure_sock
    #if port does not work an exception is thrown and program exits
    except Exception as e:
        print(e)
        exit()

Отслеживание сервера: https://imgur.com/mMmNVaL

Ошибка клиента: https://imgur.com/L3CQm5F

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...