ssl - Python 'requests' [SSL : CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl. c:590)

标签 ssl https certificate python-requests x509

在向“验证”选项提供特定证书路径时,我在验证 HTTPS 端点时遇到问题;但是,将“验证”设置为 true 确实有效:

import requests

def run_tests():
    url="https://www.google.com"
    certfilename="google.crt"
    generate_cert_file( certfilename )
    response = requests.get( url, verify=False )
    print "URL:%s, Verify=False. Result: %s"%(url, response.status_code )
    response = requests.get( url, verify=True )
    print "URL:%s, Verify=True. Result: %s"%(url, response.status_code )
    response = requests.get( url, verify=certfilename )
    print "URL:%s, Verify=%s. Result: %s"%(url, certfilename, response.status_code )

def generate_cert_file( filename ):
    cert_text=('''\
-----BEGIN CERTIFICATE-----
MIIEgDCCA2igAwIBAgIIIxZ+YmNtB9AwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwOTA5MjI1MzM5WhcNMTUxMjA4MDAwMDAw
WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3
Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDqH1dz
jOr385g9DXVZowTLkhjCoYGQ/zOLzslSFowYqZnlMiE7iZ8Vm9/iJfhStSMoA6gZ
87uqLENCi3NK+pk4+n1SIPRZS0jorb1jsyenMMy6Fxb9sQe3ndqZpWBtsW5ezW9t
7q5HWA1cNm1KSi2fmwZpDrSaN0TYQdFbRAz6cPf6J/P66qyEC7OInFgLsy4FDdp8
itpjCo/gnk2gz1vpWjiRYLCkz/dlFY3M3kR/s7YcJa7UP7BZ+QmmDfN3y4mxmEfn
Cg8rB25ZbD+oQ+Hua3/oMrx4r3lliou3yrD08/ABEqs16EEPX5wFHtI4CQYAUt5E
rEDl36bpvFD0QkfLAgMBAAGjggFLMIIBRzAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE
XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0
MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G
A1UdDgQWBBQHiMS+8X3+WcfbMQymf9yX9XA1yDAMBgNVHRMBAf8EAjAAMB8GA1Ud
IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHW
eQIFATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29n
bGUuY29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAUvY5/JbZLfahjC4F
IZU0jVtGRBDa6tXLhCHAdwLHYLQdHn74oQ8Y1vxL0AYd7V2SBAgrDjCoK9bDQbQi
UZ7xwG9K2O75bS2qYc/OlZLJr0Gdfs71ZpQzlv14SGBXvwPuD6noj+hiZjqICd6t
3Rd5oIFiZvkhNDdN6Uag28rIfR8HECdlkbZNZeLZnyoIaxsprANvlEkY0wEbn1K9
kww3/SYKbdPJ8VQSUOtWgGsO1RPFaE4PP7hCg8Q062+mmCs0ZMQSvrzzv7JQsO5J
EkdG6691HdVA6z/rRGGX8E6assTnJLmVMxRayV+Do07KvywLONTInUWue8heHUSX
EHJZbg==
-----END CERTIFICATE-----\
''')
    with open(filename, "wb") as output:
        output.write(cert_text)

if __name__=='__main__':
   run_tests()

我在这里做错了什么吗? (我嵌入了内联证书,以使代码更易于运行,而无需提供单独的证书文件)

我从 git 存储库中获取了“请求” - 历史上最新版本的 TAG 是 V2.7.0,最新提交是“46ff1a9a543cc4d33541aa64c94f50f0a698736e”

编辑:我实际上在这里有错误的证书(感谢 Steffen Ullrich 指出这一点):但我现在已经确认我有正确的证书/端点:并且我得到了相同的错误。

我像这样检索了证书:

openssl s_client -connect www.google.com:443

并且刚刚将证书详细信息复制到 python 程序中。 这个问题实际上也发生在我自己的内部系统上 - 使用自签名证书(这是我的真实用例)。

或者:“verify=True”选项实际上在哪里寻找受信任的证书/CA? (在 Java 上,它是“cacerts” - 不确定这里的 Python/requests 的等价物是什么?)。

我这里使用的是 Windows 平台。

最佳答案

您使用的证书仅对 www.google.co.uk 有效,但可以访问 www.google.com。因此证书根本无法匹配。而且我不确定使用主机证书而不是颁发者证​​书(即根 CA 或中间 CA)是否有效。

关于ssl - Python 'requests' [SSL : CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl. c:590),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32745309/

相关文章:

java - 在 Spring Boot 中存储证书的最佳做法是什么?

android - 无法手动将签名的 apk 安装到设备,出现错误 "App not installed"

iOS吊销证书会影响App Store的推送通知吗?

ssl - 从证书值创建 .cer 文件

django - 如何在 CloudFoundry 的 HTTPS 上运行 Gunicorn

android - 忽略 DefaultHttpClient 中的 ssl 错误

android - 使用 SSL 的移动跟踪

ssl - HTTPS下的 Tornado 服务器错误

使用 dictconfig 的 Python Loggly 日志记录设置

apache - 如何使用自定义域在 heroku 上启用完美前向保密?