
私はローカルマシンで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
、主に 2 つのオプションがあります。
自己署名証明書をCAとして扱う
注記: 正しい証明書を持っていることを確認する必要があります。そうしないと、以下の2番目のオプションと同じ問題が発生する可能性があります。
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 名) があれば、上記のクライアントのいずれでも追加のオプションは必要ありません。