我正在尝试访问一个端点,这需要一个客户端证书。 我从.p12开始,我能够快速导入谷歌浏览器,并且可以成功访问端点。因此,客户端证书和终结点是兼容的。
但是,我正在努力让 Python 请求模块(使用 Python 2.7)成功访问相同的端点。
我的步骤是:
openssl pkcs12 -in my.p12 -out certificate.pem –nodes
提示我输入密码,然后创建 certificate.pemprint(requests.get("<https://endpoint>", cert="certificate.pem").content)
返回您无权访问此服务器上的"http"。(和 HTTP 响应 403)
我的PEM文件包含三组-----BEGIN CERTIFICATE-----
,然后-----BEGIN PRIVATE KEY-----
。 所有 4 个 BEGIN 前面都有包属性 - 删除这些行不会有什么区别。
我正在使用 Ubuntu VM 进行密钥创建,但从 Windows 机器运行 Python - 不确定这是否有区别。
我欢迎任何想法;特别是要了解问题是否与转换为 PEM 有关,或者是否与请求调用有关。
该错误并不表示客户端证书存在问题。
如果您的客户端证书有问题,文档建议您的错误将以"SSLError"为前缀:http://docs.python-requests.org/en/master/user/advanced/#client-side-certificates
相关错误可能出现在您出于隐私原因审查的部分。获得身份验证后,Web 服务器会出于其他原因拒绝您的请求。
可能你正在打电话给requests.get('https://website.com', ...
您可能需要致电requests.get('https://website.com/', ...
或者直接在网站内请求文件资源。使用 Chrome 进行测试时,Chrome 向网络服务器发出请求时可能使用了未显示的尾随"/"。尝试在地址末尾添加/。
当然,您不应该使用示例中所示的"<">"标签。
我找到了 https://gist.github.com/erikbern/756b1d8df2d1487497d29b90e81f8068,这些评论中建议的delete=False
参数和pyOpenSSL现在可以工作了。