SSL с самозаверяющим сертификатом с использованием Python

Я пытаюсь построить простой сервер в Python, используя свой собственный сертификат. Я создал файлы.cer, .pfx, .pvk, используя makecert.

context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="ServerSSL.cer")

Traceback (most recent call last):
  File "ssl_server.py", line 4, in <module>
    context.load_cert_chain(certfile="ServerSSL.cer")
ssl.SSLError: [SSL] PEM lib (_ssl.c:2580)

Что я сделал не так? Я также попытался преобразовать свой cer файл в pem, изменив суффикс, и я получил ту же ошибку.

1 ответ

Решение

Когда вы посмотрите на первоисточник _ssl.c:2580 ты это видишь SSL_CTX_use_certificate_chain_file не удалось. Так как ни pw_info.error ни errno установлено, что не легко найти причину. Проблема может быть вызвана crt файл. Откройте его в текстовом редакторе и проверьте, выглядит ли файл именно так, как он должен выглядеть - также проверьте новые строки. Если они не совпадают ТОЧНО, вызов функции не удастся.

2567:    PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
2568:    r = SSL_CTX_use_certificate_chain_file(self->ctx, certfile_bytes);
2569:    PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
2570:    if (r != 1) {
2571:        if (pw_info.error) {
2572:            ERR_clear_error();
2573:            /* the password callback has already set the error information */
2574:        }
2575:        else if (errno != 0) {
2576:            ERR_clear_error();
2577:            PyErr_SetFromErrno(PyExc_IOError);
2578:        }
2579:        else {
2580:            _setSSLError(NULL, 0, __FILE__, __LINE__);
2581:        }
2582:        goto error;

В документации также говорится:

Сертификаты должны быть в формате PEM и должны быть отсортированы, начиная с сертификата субъекта (действительный сертификат клиента или сервера), за которым следуют промежуточные сертификаты CA, если это применимо, и заканчивая СА высшего уровня (корневым).

Другие вопросы по тегам