我在本地机器上运行 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.
当我尝试按照该证书和密钥连接到本地主机时文档:
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 名称),上述任何客户端都不需要额外的选项。