Сокет TLS / SSL python сервер - PullRequest
       9

Сокет TLS / SSL python сервер

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

Я пытаюсь создать простой HTTPS-сервер с Python3, используя модули socket и ssl. У меня есть самозаверяющий сертификат и файлы закрытого ключа, сгенерированные OpenSSL, и я пытался использовать их с модулем ssl, но каждый раз, когда я пытаюсь это сделать, я получаю « ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 предупреждение о неизвестном сертификате (_ssl. c: 1076)"ошибка. Мой код:

import socket
import ssl
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    context.load_cert_chain(certfile='cert.pem', keyfile='my_key.key')
    context.verify_mode = ssl.CERT_NONE
    sock = socket.socket()
    sock.bind(('', 443))
    sock.listen(5)
    while True:
        new_conn, addr = sock.accept()
        ssl_conn = context.wrap_socket(new_conn, server_side=True)
        print(ssl_conn.recv(1024).decode())     # this is where i get the error

Я получаю ошибку:

  File "C:\AllInOne\PortableApps\Python374\lib\ssl.py", line 1139, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:1076)

Кто-нибудь знает, почему это происходит или как это исправить?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020
    # Generate server.pem with the following command:
#    mkdir .ssh
#    openssl req -new -x509 -keyout .ssh/key.pem -out .ssh/cert.pem -days 365 -nodes
# run as follows:
#    python3 simple-https-server.py
# then in your browser, visit:
#    https://localhost:4443

import http.server
from http.server import HTTPServer, BaseHTTPRequestHandler, SimpleHTTPRequestHandler
import ssl
import sys

#This class will handles any incoming request from the browser
class myHandler(BaseHTTPRequestHandler):
        #Handler for the GET requests
        def do_GET(self):
                print(self.requestline)
                #print(self.rfile.read(content_length))
                self.send_response(200)
                self.send_header('Content-type','text/html')
                self.end_headers()
                # Send the html message
                self.wfile.write("Hello World !".encode())
                return

try:
        separator = "-" * 80
        server_address = ('', 4443)
        # server_address = ('localhost', 4443)
        httpd = http.server.HTTPServer(server_address, myHandler)
        # httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
        httpd.socket = ssl.wrap_socket(httpd.socket,
                            server_side=True,
                            certfile=".ssh/cert.pem",
                            keyfile=".ssh/key.pem",
                            ssl_version=ssl.PROTOCOL_TLS)        
        print(separator)
        print("Server running on https://localhost:4443")
        print(separator)

        # Wait forever for incoming htto requests
        httpd.serve_forever()

except KeyboardInterrupt:
        print ('^C received, shutting down the web server')
        server.socket.close()
0 голосов
/ 21 апреля 2020
ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:1076)

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

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