ssl с самоподписанным сертификатом с использованием 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, изменив суффикс, и получил ту же ошибку.


person J. Doe    schedule 01.10.2015    source источник
comment
Какая версия Python используется?   -  person HelloWorld    schedule 01.10.2015
comment
Моя версия Python 2.7.10 32-битная.   -  person J. Doe    schedule 01.10.2015
comment
Да, я взял свой код оттуда.   -  person J. Doe    schedule 01.10.2015


Ответы (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 и должны быть отсортированы, начиная с сертификата субъекта (фактического сертификата клиента или сервера), за которым следуют промежуточные сертификаты ЦС, если применимо, и заканчивая ЦС самого высокого уровня (корневой).

person HelloWorld    schedule 01.10.2015