До сих пор я разработал 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.