简单HTTP服务器SSL record_too_long错误

时间:2013-10-10 21:27:42

标签: python ssl pyopenssl

我正在尝试使用CGIHTTPServer运行一些Python CGI脚本。这工作正常,但现在我想在Web侦听器上使用SSL运行。

我从Activestate code recipes开始使用解决方案,并将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界面?

1 个答案:

答案 0 :(得分:0)

使用Apache httpd使用现有的Python CGI脚本来获取SSL。我仍然想知道如何使用CGIHTTPServer类,但