我正在尝试使用 CGIHTTPServer 运行一些 Python CGI 脚本。这工作正常,但现在我想在 Web 侦听器上使用 SSL 运行。
我从Activestate代码配方中的解决方案开始,并将 SimpleHTTPRequestHandler 更改为 CGIHTTPRequestHandler。这可以很好地提供静态文件,包括 cgi 脚本(cgi-bin 目前是指向“.”的链接)但对于 cgi 脚本 Firefox 显示
“SSL 收到了超过最大允许长度的记录”
错误代码:ssl_error_rx_record_too_long。
网络搜索表明这可能是服务器问题,而不是浏览器问题,这对我来说似乎是合乎逻辑的。此外,我已经尝试了所有建议的浏览器设置。我也尝试了各种服务器设置,但没有任何乐趣。
- 平台是 RHEL 2.6.18
- Python 是 2.4.3 - 请不要建议使用“
import ssl
”,因为它不可用 - 自签名证书,在浏览器中接受(静态文件工作)
代码:
import socket, sys
import SocketServer
import BaseHTTPServer
import CGIHTTPServer
from OpenSSL import SSL
class SecureHTTPServer(BaseHTTPServer.HTTPServer):
def __init__(self, server_address, HandlerClass):
self.allow_reuse_address = True
SockeServer.BaseServer.__init__(self, server_address, HandlerClass)
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file ("path/key.pem")
ctx.use_certificate_file("path/cert.pem")
self.socket = SSL.Connection(ctx, socket.socket(self.address_family, self.socket_type))
self.server_bind()
self.server_activate()
class SecureHTTPRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler):
def setup(self):
self.cgi_directories= ['cgi-bin']
self.connection = self.request
self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
def test(HandlerClass = SecureHTTPRequestHandler, ServerClass = SecureHTTPServer):
httpd = ServerClass(('0.0.0.0',4443), HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTPS on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
if __name__ == '__main__':
test()
我怎样才能让它在 Python 2.4 中为一个快速简单的 Web 界面工作?