1

Я запускаю свой бэкэнд Django на своей локальной машине и пытаюсь подключиться к нему через HTTPie (https://httpie.org/).

Когда я запускаю python manage.py runsslserver он дает мне такой вывод:

Starting development server at https://127.0.0.1:8000/
Using SSL certificate: //anaconda/lib/python3.6/site-packages/sslserver/certs/development.crt
Using SSL key: //anaconda/lib/python3.6/site-packages/sslserver/certs/development.key
Quit the server with CONTROL-C.

Когда я пытаюсь подключиться к localhost, используя этот сертификат и ключ в соответствии с документацией:

http --cert=//anaconda/lib/python3.6/site-packages/sslserver/certs/development.crt --cert-key=//anaconda/lib/python3.6/site-packages/sslserver/certs/development.key https://127.0.0.1:8000/

Я получаю ошибку рукопожатия:

http: error: SSLError: ("bad handshake: Error([('SSL 
routines','ssl3_get_server_certificate', 'certificate verify 
failed')],)",) while doing GET request to URL: https://127.0.0.1:8000/

Почему это не соединяется?

1 ответ1

2

На основании связанной с вами документации по HTTPie выясняется, что вы неправильно используете команду http . Указанные параметры --cert и -cert-key предназначены для аутентификации сертификата клиента (например, вместо токена API). Я не могу быть уверен, но я предполагаю, что вы не используете аутентификацию сертификата клиента.

Предполагая, что у вас есть самозаверяющий сертификат SSL по адресу //anaconda/lib/python3.6/site-packages/sslserver/certs/development.crt , у вас есть два основных варианта:

Рассматривайте самоподписанный сертификат как центр сертификации

Примечание: вы должны быть уверены, что у вас есть правильный сертификат, или вы рискуете теми же проблемами, что и второй вариант ниже

http --verify=//anaconda/lib/python3.6/site-packages/sslserver/certs/development.crt https://127.0.0.1:8000/

или с помощью wget или curl:

curl --cacert //anaconda/lib/python3.6/site-packages/sslserver/certs/development.crt https://127.0.0.1:8000/
wget --ca-certificate=//anaconda/lib/python3.6/site-packages/sslserver/certs/development.crt https://127.0.0.1:8000/

Пропустить проверку SSL

Примечание. Этот метод по-прежнему будет шифровать ваши данные, но не будет пытаться аутентифицировать удаленную конечную точку (т. Е. Вы можете шифровать данные и отправлять их злоумышленнику). Следовательно, это НЕ РЕКОМЕНДУЕТСЯ для производственного использования.

http --verify=no https://127.0.0.1:8000/

Также обратите внимание, что существуют и другие, наиболее часто используемые http-клиенты командной строки:

curl -k https://127.0.0.1:8000/
wget --no-check-certificate https://127.0.0.1:8000/

Давайте зашифруем

Наконец, вы можете рассмотреть вопрос о получении действительного сертификата SSL. Let's Encrypt предлагает их бесплатно, и есть много других CA, которые вы могли бы рассмотреть, если вы хотите кому-то заплатить. При наличии действующего сертификата SSL (и действительного имени DNS) никакие дополнительные параметры не требуются ни для одного из упомянутых клиентов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .