在python HTTPSServer中检索TLS / SSL对等客户端证书?

时间:2019-03-15 20:06:43

标签: python ssl ssl-certificate basehttpserver

到目前为止,我使用python BaseHTTPServerssl开发了一个https服务器,因此可以在here中找到一个超级简单的代码。

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的相当稳定的解决方案,其中服务器等待与客户端的连接,然后获取对等证书(即,参见here),更具体地说:

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()连续运行,所以我想知道是否有解决方案或方法在处理http方法之前,请侵入BaseHTTPServer, SimpleHTTPServer服务器解决方案并使用getpeercert()获取客户端证书。

0 个答案:

没有答案