zoukankan      html  css  js  c++  java
  • Python笔记——网络服务器之HTTPS服务

    现在记录HTTPS服务端的编写。

    import ssl, socket, time

    if __name__ == "__main__":

        context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
        #context.load_cert_chain(certfile=‘key_pub.pem’, keyfile=‘key_priv.pem')   #可以分开定义公钥和私钥文件,也可以合并成一个文件
        context.load_cert_chain(certfile=’cert.pem')
       
        bindsocket = socket.socket()
        bindsocket.bind(('127.0.0.1', 443))
        bindsocket.listen(5)
       
        newsocket, fromaddr = bindsocket.accept()
        connstream = context.wrap_socket(newsocket, server_side=True)
       
        try:
            data = connstream.recv(1024)
            print(data)
            buf = 'Hi NN%f\n\n\n\n'%time.time()
            buf = buf.encode()
            connstream.send(buf)
        finally:
            connstream.shutdown(socket.SHUT_RDWR)
            connstream.close()
            bindsocket.close()

    此例没有使用socketserver框架,目的在于测试ssl模块的用法。



    继续,用框架实现HTTPS服务

    import socketserver, ssl, time
    class MyHTTPSHandler_socket(socketserver.BaseRequestHandler):
        def handle(self):
            context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
            context.load_cert_chain(certfile="cert.pem")
            SSLSocket = context.wrap_socket(self.request, server_side=True)
            self.data = SSLSocket.recv(1024)
            print(self.data)
            buf = 'test HTTPS Server Handler<br>%f'%time.time()
            buf = buf.encode()
            SSLSocket.send(buf)

    if __name__ == "__main__":
        port = 443
        httpd = socketserver.TCPServer(('localhost‘, port), MyHTTPSHandler_socket)
        print(’https serving at port', port)
        httpd.serve_forever()

    说明:handle()函数负责所有与客户端的通信。客户端连接过来之后,ssl模块载入证书,并用SSLSocket对socket进行封装,屏蔽底层的加密通信细节。


    下面再给出HTTPS文件服务器代码,文件访问功能由SimpleHTTPRequestHandler实现,数据加密传输由ssl实现。

    import socketserver, ssl, time, http.server
    class MyHTTPS_SimpleHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
        def setup(self):
            print('setup')
            context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
            context.load_cert_chain(certfile=‘cert.pem’)
            SSLSocket = context.wrap_socket(self.request, server_side=True)
            self.rfile = SSLSocket.makefile('rb', self.rbufsize)
            self.wfile = SSLSocket.makefile('wb', self.wbufsize)
           
    if __name__ == "__main__":
        port = 443
        httpd = socketserver.TCPServer(("localhost", port), MyHTTPS_SimpleHTTPRequestHandler)
        print('https serving at port', port)
        httpd.serve_forever()

    最后,要指出的是setup()和handle()都是在客户端开始连接之后才被调用,从顺序上来说setup()先于handle()。



  • 相关阅读:
    el-select 和 el-checkbox
    element-ui : <el-table> 按钮点击操作阻止@row-click
    vue 点击按钮几种总结
    div内元素右对齐 && 文字对齐
    父元素高度为 0, 导致元素错位
    从后端传过来的数据,明明是换行,却都替换成空格了。
    Spoken English
    C++ ofstream和ifstream
    C++ 文件操作实例
    matlab
  • 原文地址:https://www.cnblogs.com/jiangu66/p/2996569.html
Copyright © 2011-2022 走看看