
Я запускаю свой бэкэнд 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
На основании документации HTTPie, на которую вы ссылаетесь, похоже, что вы http
неправильно используете команду. Параметры --cert
и -cert-key
, которые вы указали, предназначены для аутентификации клиентского сертификата (вместо API-токена, например). Я не уверен, но предполагаю, что вы не используете аутентификацию клиентского сертификата.
Предполагая, что у вас естьСамоподписанный SSL-сертификату //anaconda/lib/python3.6/site-packages/sslserver/certs/development.crt
вас есть два основных варианта:
Рассматривать самоподписанный сертификат как сертификат CA
Примечание: Вы должны быть уверены, что у вас есть правильный сертификат, иначе вы рискуете столкнуться с теми же проблемами, что и во втором варианте ниже.
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-сертификата.Давайте зашифруемпредлагает их бесплатно, и есть много других CA, которые вы могли бы рассмотреть, если хотите что-то кому-то заплатить. С действительным сертификатом SSL (и действительным именем DNS) никакие дополнительные опции не должны потребоваться ни для одного из упомянутых клиентов.