Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
curl——cacert与python请求验证_Python_Ssl_Curl_Python Requests_Ca - Fatal编程技术网

curl——cacert与python请求验证

curl——cacert与python请求验证,python,ssl,curl,python-requests,ca,Python,Ssl,Curl,Python Requests,Ca,我正在尝试通过https连接到一个使用非官方CA的网站。出于某种原因,它可以处理curl,但不能处理python请求 请参见下面的示例 Python 3.8.0(默认,2019年10月30日11:47:54) 有关详细信息,请键入“版权”、“信用”或“许可证” IPython 7.9.0——一种增强的交互式Python。键入“?”以获取帮助。 在[1]中:导入请求 在[2]中:请求 Out[2]:“2.22.0” 在[3]中:cert=“…” 在[4]中:url=“…” 在[5]:!curl--

我正在尝试通过https连接到一个使用非官方CA的网站。出于某种原因,它可以处理curl,但不能处理python请求

请参见下面的示例

Python 3.8.0(默认,2019年10月30日11:47:54)
有关详细信息,请键入“版权”、“信用”或“许可证”
IPython 7.9.0——一种增强的交互式Python。键入“?”以获取帮助。
在[1]中:导入请求
在[2]中:请求
Out[2]:“2.22.0”
在[3]中:cert=“…”
在[4]中:url=“…”
在[5]:!curl--cacert{cert}{url}
{“状态”:200}
在[6]中:requests.get(url,verify=cert)
---------------------------------------------------------------------------
SSLCertVerificationError回溯(上次最近的调用)
...
SSLCertVerificationError:[SSL:证书\u验证\u失败]证书验证失败:无法获取颁发者证书(\u SSL.c:1108)
在处理上述异常期间,发生了另一个异常:
MaxRetryError:HTTPSConnectionPool(主机=“…”,端口=443):超过url的最大重试次数:。。。(由SSLError(SSLCertVerificationError(1),[SSL:CERTIFICATE\u Verification\u FAILED]CERTIFICATE Verification FAILED:无法获取颁发者证书(\u SSL.c:1108'))引起)
在处理上述异常期间,发生了另一个异常:
SSLError回溯(最近一次呼叫最后一次)
...
SSLError:HTTPSConnectionPool(主机=“…”,端口=443):超过url的最大重试次数:。。。(由SSLError(SSLCertVerificationError(1),[SSL:CERTIFICATE\u Verification\u FAILED]CERTIFICATE Verification FAILED:无法获取颁发者证书(\u SSL.c:1108'))引起)
我做错了什么?为什么会有不同的表现

--编辑--

curl肯定会使用此证书,如果没有它,curl将失败

[9]中的
:!curl{url}
curl:(60)服务器证书验证失败。CAfile:/etc/ssl/certs/ca-certificates.crt文件:无
详情如下:http://curl.haxx.se/docs/sslcerts.html
...
在[10]中:
。。。它是一种中间的CA

信任存储中只有中间CA不足以验证证书,至少在当前版本的Python中是这样。此功能需要使用OpenSSL标志
X509_V_标志\u部分_链
进行验证,默认情况下也不会设置


与此相反,curl在较新版本中有效。

它与verify=False一起工作吗?cert文件的内容是什么?它是根CA还是只是中间CA?或者它是一个自签名证书,在基本约束中没有设置CA标志?@JoranBeasley Yes@SteffenUllrich它是一个中间CA。有两种方法可以解决这个问题,在python中不能使用两个文件,但可以将根CA和子CA连接到一个文件中。另一种方法是服务器显示整个链。@Kazz:第一种方法是将包括根证书在内的整个链放入CA存储。服务器发送包括根CA在内的完整链的第二个选项不是。客户端将忽略服务器发送的任何根CA,因为它希望信任链的根已在本地受信任。