我正在尝试在Python 2.7中使用BaseHTTPServer实现SSL包装套接字和CGIHTTPServer。我使用SimpleHTTPRequestHandler,但我需要包含CGI功能。
评论代码来自之前的迭代,因为我一直试图解决问题。如果
ServerClass = HTTPServer
(见run()
),我得(Error code: ssl_error_rx_record_too_long)
。如果我使用ServerClass = SecureHTTPServer
,我可以在端口80上加载页面,但是我在443上重置连接。
我非常感谢帮助获得支持SSL的Web服务器支持CGI!
#!/usr/bin/env python
import socket, os, sys
from SocketServer import BaseServer
from BaseHTTPServer import HTTPServer
from CGIHTTPServer import *
import cgitb; cgitb.enable()
from OpenSSL import SSL
class SecureHTTPServer(HTTPServer):
def __init__(self, server_address, HandlerClass):
BaseServer.__init__(self, server_address, HandlerClass)
Context = SSL.Context(SSL.SSLv23_METHOD)
pem = 'C:\SERV\cert.pem'
Context.use_privatekey_file(pem)
Context.use_certificate_file(pem)
self.socket = SSL.Connection(Context, socket.socket(self.address_family,self.socket_type))
self.server_bind()
self.server_activate()
class SecureHTTPRequestHandler(CGIHTTPRequestHandler):
cgi_directories = ['/cgi']
#def setup(self):
#self.connection = self.request
#self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
#self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
def run(HandlerClass = SecureHTTPRequestHandler,ServerClass = SecureHTTPServer):
server_address = ('localhost', 443)
handler = CGIHTTPRequestHandler
server = ServerClass(server_address, handler)
sa = server.socket.getsockname()
try:
print "Server SSL HTTPS on", sa[0], "port", sa[1], "..."
server.serve_forever()
except:
server.socket.closed()
if __name__ == '__main__':
run()