如果这个问题在其他地方得到了回答,而实际上没有,我在网上广泛地浏览了一下。
当尝试在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
context.load_verify_locations(cafile = "crl.pem")
sock = socket.socket()
sock.bind(('', port))
sock.listen(backlog)
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)))
客户:
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
context.load_verify_locations("crl.pem")
conn = context.wrap_socket(socket.socket(), server_hostname=server_ip)
return conn
conn = createClientSideSocket("192.168.1.7")
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)