【问题标题】:Cannot instantiate python BaseHTTPServer on https port (443) [Errno 10013]无法在 https 端口 (443) 上实例化 python BaseHTTPServer [Errno 10013]
【发布时间】:2019-08-15 12:45:24
【问题描述】:

BaseHTTPServer 不能用端口 443 实例化。我想这是为了避免与其他一些https 服务发生冲突。

因此,我尝试使用以下代码为该服务器定义 SNI,但仍然失败...

这是服务器建立代码,我是从 Windows cmd 以管理员权限运行的:

httpd = BaseHTTPServer.HTTPServer(("192.168.22.23", 443), MyRequestHandler)

tls_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) 
tls_context.load_cert_chain(certfile='./cert.csr') 
tls_context.set_servername_callback(verify_tls) 
httpd.socket = tls_context.wrap_socket(httpd.socket, do_handshake_on_connect=True, server_side=True)

httpd.socket.settimeout(30) 
httpd.serve_forever()  

这是失败的命令:

httpd = BaseHTTPServer.HTTPServer(("192.168.22.23", 443), MyRequestHandler)

和输出:

c:\python27\lib\SocketServer.pyc in __init__(self, server_address, RequestHandlerClass, bind_and_activate)
    415         if bind_and_activate:
    416             try:
--> 417                 self.server_bind()
    418                 self.server_activate()
    419             except:

c:\python27\lib\BaseHTTPServer.pyc in server_bind(self)
    106     def server_bind(self):
    107         """Override server_bind to store the server name."""
--> 108         SocketServer.TCPServer.server_bind(self)
    109         host, port = self.socket.getsockname()[:2]
    110         self.server_name = socket.getfqdn(host)

c:\python27\lib\SocketServer.pyc in server_bind(self)
    429         if self.allow_reuse_address:
    430             self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
--> 431         self.socket.bind(self.server_address)
    432         self.server_address = self.socket.getsockname()
    433

c:\python27\lib\socket.pyc in meth(name, self, *args)
    226
    227 def meth(name,self,*args):
--> 228     return getattr(self._sock,name)(*args)
    229
    230 for _m in _socketmethods:

error: [Errno 10013] An attempt was made to access a socket in a way forbidden by its access permissions

知道如何在 443 上定义我的服务器而不会出现此错误吗?

谢谢

【问题讨论】:

    标签: python windows http ssl basehttpserver


    【解决方案1】:

    BaseHTTPServer 无法使用端口 443 进行实例化。我想这是为了避免与其他一些 https 服务发生冲突。

    是的,错误“错误:[Errno 10013] 尝试以访问权限禁止的方式访问套接字” 表明存在这样的问题。

    因此,我尝试使用以下代码为该服务器定义 SNI,但仍然失败...

    问题根本不在 TLS 层,因此在这一层做一些事情(即 SNI)将无济于事。问题出在 TCP 层:它无法绑定到端口 443,因为它已被其他进程使用。解决此问题的唯一方法是确保没有其他进程使用此端口。

    【讨论】:

    • 所以SNI只能在单个进程监听443,客户端通过SNI请求特定服务的情况下才可以使用,对吧?
    • @Zohar81:基本正确。但实际上可以让多个进程在同一个 IP:Port 上侦听,前提是它们共享侦听器套接字,或者套接字专门设计为允许在同一地址上进行多个绑定(UNIX 中的SO_REUSEPORT 套接字选项)。并且客户端不使用 SNI 请求服务,而是请求一个域(尽管每个域在特定实现中可能意味着不同的服务)。
    • 您好,也许您知道如何从我的 Windows 机器中删除以下示例中 https 端口 443 上的监听器? c:\>netstat -a -b | findstr 443 TCP 0.0.0.0:443 mycompuer:0 LISTENING TCP 127.0.0.1:443 mycompuer:54973 ESTABLISHED TCP 127.0.0.1:54429 mycompuer:54430 ESTABLISHED TCP 127.0.0.1:54430 mycompuer:54429 ESTABLISHED TCP 192.168.50.113:54437 40.67.254.36:https ESTABLISHED
    • @Zohar81:我不知道你在端口 443 上有什么监听器。也许你有一个 IIS 正在运行,在这种情况下请参阅 here
    【解决方案2】:

    尝试将端口更改为 8080。您没有说明是哪个操作系统,但大多数 UNIX 衍生产品仅允许 root 监听低于 1,024 或 4,096 的端口,具体取决于操作系统及其配置。从这个https://stackoverflow.com/a/16928146/7534176 回答。

    或者使用 sudo 运行命令。

    【讨论】:

    • 您好,感谢您的帮助,我已经添加到我正在使用 Windows 的问题中,并以管理员权限从 cmd 运行它。它实际上在 4339 端口上工作,所以对小端口的假设在这里不适用……你能想到别的吗?
    • 还要注意这里的错误是不同的([Errno 10013])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2019-02-08
    • 2019-02-28
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    相关资源
    最近更新 更多