-1

我正在尝试使用 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 界面工作?

4

1 回答 1

0

最后使用 Apache httpd 让 SSL 与现有的 Python CGI 脚本一起工作。不过,我仍然想知道如何让它与 CGIHTTPServer 类一起使用

于 2013-10-17T16:12:39.610 回答