忽略“证书未知”警报

3 投票
1 回答
5707 浏览
提问于 2025-04-17 08:10

我有一个简单的Python脚本:

import socket
import ssl

if __name__ == "__main__":
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind("", 443)
    s.listen(1)
    (conn, addr) = s.accept()
    sslconn = ssl.wrap_socket(conn, server_side=True, certfile="server.crt", keyfile="server.key", cert_reqs=ssl.CERT_NONE)

    print 'Connection established'
    while True:
        data = sslconn.recv(1024)
        if not data: break
        print "Data received"


    sslconn.close()

文件 server.crtserver.key 是用来自签名证书的公钥和私钥。如果我用Firefox连接运行这个脚本的主机,脚本就会停止运行,并显示:

ssl.SSLError: [Errno 1] _ssl.c:503: sslv3 alert certificate unknown

根据我的理解,这是因为客户端(比如Firefox)在告诉主机这个证书无效。这没问题,但为什么会导致脚本停止运行呢?我是不是需要以某种方式明确忽略这个警告?

1 个回答

3

试着捕捉这个异常,然后忽略它。这个异常应该是非致命的,也就是说它不会导致程序崩溃。

sslconn = ssl.wrap_socket(conn, server_side=True, certfile="server.crt",
                          keyfile="server.key", cert_reqs=ssl.CERT_NONE,
                          do_handshake_on_connect=False)
try:
    sslconn.do_handshake()
except ssl.SSLError, err:
    if err.args[1].find("sslv3 alert") == -1:
        raise

撰写回答