到目前为止,我使用python BaseHTTPServer
和ssl
开发了一个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()
获取客户端证书。