Как использовать CRL в pyOpenSSL? - PullRequest
0 голосов
/ 05 июля 2018

Я много смотрел в Интернете, если на этот вопрос ответили в другом месте, а это не так.

При попытке использовать CRL в библиотеке python openssl мы получаем ошибки «сертификат неизвестен». В частности, когда у crl есть отзыв сертификата, который не используется при рукопожатии соединения ssl, все равно возникает ошибка. Если вместо этого используется пустой CRL, ошибки не возникает, и устройства могут выполнить socket.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...