代码之家  ›  专栏  ›  技术社区  ›  Joe N

如何在pyopenssl中使用crl?

  •  1
  • Joe N  · 技术社区  · 6 年前

    如果这个问题在其他地方得到了回答,而实际上没有,我在网上广泛地浏览了一下。

    当尝试在python openssl库中使用crl时,会出现“证书未知”错误。具体来说,当crl撤销了ssl连接握手中未使用的证书时,仍然存在错误。如果使用空的CRL,则不会出现错误,并且设备能够完成套接字。connect()

    简单的客户机/服务器模型来说明问题:

    服务器:

    def createServerSideSocket(port, backlog=5):
        context = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)
        context.load_cert_chain(certfile="cert.pem", keyfile="key.pem", password='tempPassword')
        context.verify_flags = ssl.VERIFY_CRL_CHECK_LEAF  #specifying flag to check crl
        context.load_verify_locations(cafile = "crl.pem") #loading crl
        sock = socket.socket()
        sock.bind(('', port))
        sock.listen(backlog)    #listen on port 5000
        return sock, context
    
    port = 5000
    sock, context = createServerSideSocket(port)
    newSocket, fromAddr = sock.accept()
    connStream = context.wrap_socket(newSocket, server_side=True)
    print(bytes.decode(connStream.recv(1024)))  #receive and print data
    

    客户:

    def createClientSideSocket(server_ip):
        context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile="cacert.pem")  
        context.verify_flags = ssl.VERIFY_CRL_CHECK_LEAF #specifying flag to check crl
        context.load_verify_locations("crl.pem") #loading crl
        conn = context.wrap_socket(socket.socket(), server_hostname=server_ip)
        return conn
    
    conn = createClientSideSocket("192.168.1.7") #our IP address of the server
    conn.connect(("192.168.1.7", 5000))
    conn.sendall(str.encode("test data"))  
    

    当crl.pem有0个吊销的证书时,连接工作。当crl.pem有任何撤销(即使对于握手中未使用的撤销)时,它会失败,并出现以下错误:

    在客户机上:

    ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)
    

    在服务器上:

    [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:777)
    
    0 回复  |  直到 6 年前