Получение сертификата равноправного клиента TLS / SSL в python HTTPSServer? - PullRequest
0 голосов
/ 15 марта 2019

До сих пор я разработал https-сервер, использующий python BaseHTTPServer и ssl, для которого можно найти супер простой код здесь .

import BaseHTTPServer, SimpleHTTPServer
import ssl

httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket, certfile='./TAserver.pem', ssl_version=ssl.PROTOCOL_TLSv1_2, server_side=True,\
cert_reqs = ssl.CERT_REQUIRED, ca_certs="./ca-certificates.crt", do_handshake_on_connect=True, suppress_ragged_eofs=True)
httpd.serve_forever()

В моем случае мне нужно сначала получить сертификат сверстника клиента и провести перекрестную проверку с предварительно сохраненными отпечатками пальцев, чтобы уменьшить риск прослушивания. Поиск в этом поле показал, что существуют решения для клиентов через getpeercert(), когда клиент подключен к серверу (, что не отвечает интересам этого вопроса ). И на стороне сервера я нашел довольно стабильное решение, использующее socket, где сервер ожидает соединения с клиентом, а затем получает сертификат однорангового узла (то есть см. здесь ), более конкретно:

while True:
    print("Waiting for client")
    newsocket, fromaddr = bindsocket.accept()
    print("Client connected: {}:{}".format(fromaddr[0], fromaddr[1]))
    conn = context.wrap_socket(newsocket, server_side=True)
    print("SSL established. Peer: {}".format(conn.getpeercert()))

Поскольку подготовка сокетов с httpd в BaseHTTPServer происходит в фоновом режиме, и, кроме того, сервер работает непрерывно через httpd.serve_forever(), мне было интересно, есть ли решение или способ взломать сервер BaseHTTPServer, SimpleHTTPServer решение и получить сертификат клиента, используя getpeercert(), прежде чем выполнять обработку методов http.

...