openssl,python请求错误:“证书验证失败”

乍得

如果我在开发框中运行以下命令:

$ openssl s_client -connect github.com:443

我得到以下输出的最后一行:

Verify return code: 20 (unable to get local issuer certificate)

如果我尝试通过请求执行此操作,则会收到另一个失败的请求:

>>> import requests
>>> r = requests.get('https://github.com/', verify=True)

提出一个例外:

SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我还可以运行带有verify标志的第一个命令并获得类似的输出:

$ openssl s_client -connect github.com:443 -verify 9
...
Verify return code: 27 (certificate not trusted)

基本上,这告诉我证书有问题。我可以使用这两种方法指定特定的证书,并且可以使用:

$ openssl s_client -connect github.com:443 -CAfile /etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem -verify 9
...
Verify return code: 0 (ok)

和:

>>> r = requests.get('https://github.com/', verify='/etc/ssl/certs/DigiCert...pem')
<Response [200]>

那么,对我的问题,这到底是哪里错了?请求/ openssl是否不应该知道在哪里可以找到有效的证书?

其他资讯:

  • 的Python == 2.7.6
  • 请求== 2.2.1
  • openssl 0.9.8小时

另外,我知道传递verify=False给该requests.get方法也可以,但是我确实要验证。

编辑

我已经确认,正如@Heikki Toivonen在回答中指出的那样,为我正在运行的openssl版本指定-CAfile标志是可行的。

$ openssl s_client -connect github.com:443 -CAfile `python -c 'import requests; print(requests.certs.where())'`
...
Verify return code: 0 (ok)

因此,我正在运行的openssl版本没有任何问题,而请求提供的默认cacert.pem文件也没有任何问题。

既然我知道openssl是按这种方式工作的,必须指定CAfile或查找证书的位置,那么我更关心使请求生效。

如果我运行:

>>> r = requests.get('https://github.com/', verify='path to cacert.pem file')

我仍然遇到与以前相同的错误。我什至尝试从http://curl.haxx.se/ca下载cacert.pem文件,但仍然无法正常工作。如果我指定了特定的供应商证书文件,则请求似乎仅在此特定机器上有效。

旁注:在我的本地计算机上,一切正常。这两台机器之间有一些区别。到目前为止,我还无法确定导致此问题的具体区别是什么。

w

如果我在开发框中运行以下命令:

$ openssl s_client -connect github.com:443

我得到以下输出的最后一行:

Verify return code: 20 (unable to get local issuer certificate)

您缺少DigiCert High Assurance EV CA-1信任的根源:

$ openssl s_client -connect github.com:443
CONNECTED(00000003)
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV CA-1
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/businessCategory=Private Organization/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/serialNumber=5157550/street=548 4th Street/postalCode=94107/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=github.com
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1
 1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA
---
Server certificate
...
Start Time: 1393392088
Timeout   : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)

DigiCert High Assurance EV CA-1DigiCert受信任的根颁发机构证书下载

$ wget https://www.digicert.com/CACerts/DigiCertHighAssuranceEVCA-1.crt
--2014-02-26 00:27:50--  https://www.digicert.com/CACerts/DigiCertHighAssuranceEVCA-1.crt
Resolving www.digicert.com (www.digicert.com)... 64.78.193.234
...

将DER编码的证书转换为PEM:

$ openssl x509 -in DigiCertHighAssuranceEVCA-1.crt -inform DER -out DigiCertHighAssuranceEVCA-1.pem -outform PEM

然后,通过以下命令将其与OpenSSL结合使用-CAfile

$ openssl s_client -CAfile DigiCertHighAssuranceEVCA-1.pem -connect github.com:443
CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV CA-1
verify return:1
depth=0 businessCategory = Private Organization, 1.3.6.1.4.1.311.60.2.1.3 = US, 1.3.6.1.4.1.311.60.2.1.2 = Delaware, serialNumber = 5157550, street = 548 4th Street, postalCode = 94107, C = US, ST = California, L = San Francisco, O = "GitHub, Inc.", CN = github.com
verify return:1
---
Certificate chain
 0 s:/businessCategory=Private Organization/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/serialNumber=5157550/street=548 4th Street/postalCode=94107/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=github.com
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1
 1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIHOjCCBiKgAwIBAgIQBH++LkveAITSyvjj7P5wWDANBgkqhkiG9w0BAQUFADBp
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSgwJgYDVQQDEx9EaWdpQ2VydCBIaWdoIEFzc3VyYW5j
ZSBFViBDQS0xMB4XDTEzMDYxMDAwMDAwMFoXDTE1MDkwMjEyMDAwMFowgfAxHTAb
BgNVBA8MFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYBBAGCNzwCAQMTAlVT
MRkwFwYLKwYBBAGCNzwCAQITCERlbGF3YXJlMRAwDgYDVQQFEwc1MTU3NTUwMRcw
FQYDVQQJEw41NDggNHRoIFN0cmVldDEOMAwGA1UEERMFOTQxMDcxCzAJBgNVBAYT
AlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
MRUwEwYDVQQKEwxHaXRIdWIsIEluYy4xEzARBgNVBAMTCmdpdGh1Yi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDt04nDXXByCfMzTxpydNm2WpVQ
u2hhn/f7Hxnh2gQxrxV8Gn/5c68d5UMrVgkARWlK6MRb38J3UlEZW9Er2TllNqAy
GRxBc/sysj2fmOyCWws3ZDkstxCDcs3w6iRL+tmULsOFFTmpOvaI2vQniaaVT4Si
N058JXg6yYNtAheVeH1HqFWD7hPIGRqzPPFf/jsC4YX7EWarCV2fTEPwxyReKXIo
ztR1aE8kcimuOSj8341PTYNzdAxvEZun3WLe/+LrF+b/DL/ALTE71lmi8t2HSkh7
bTMRFE00nzI49sgZnfG2PcVG71ELisYz7UhhxB0XG718tmfpOc+lUoAK9OrNAgMB
AAGjggNUMIIDUDAfBgNVHSMEGDAWgBRMWMsl8EFPUvQoyIFDm6aooOaS5TAdBgNV
HQ4EFgQUh9GPGW7kh29TjHeRB1Dfo79VRyAwJQYDVR0RBB4wHIIKZ2l0aHViLmNv
bYIOd3d3LmdpdGh1Yi5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG
AQUFBwMBBggrBgEFBQcDAjBjBgNVHR8EXDBaMCugKaAnhiVodHRwOi8vY3JsMy5k
aWdpY2VydC5jb20vZXZjYTEtZzIuY3JsMCugKaAnhiVodHRwOi8vY3JsNC5kaWdp
Y2VydC5jb20vZXZjYTEtZzIuY3JsMIIBxAYDVR0gBIIBuzCCAbcwggGzBglghkgB
hv1sAgEwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9z
c2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4A
eQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQA
ZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUA
IABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAA
YQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcA
cgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIA
aQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQA
ZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMH0G
CCsGAQUFBwEBBHEwbzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu
Y29tMEcGCCsGAQUFBzAChjtodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln
aUNlcnRIaWdoQXNzdXJhbmNlRVZDQS0xLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqG
SIb3DQEBBQUAA4IBAQBfFW1nwzrVo94WnEUzJtU9yRZ0NMqHSBsUkG31q0eGufW4
4wFFZWjuqRJ1n3Ym7xF8fTjP3fdKGQnxIHKSsE0nuuh/XbQX5DpBJknHdGFoLwY8
xZ9JPI57vgvzLo8+fwHyZp3Vm/o5IYLEQViSo+nlOSUQ8YAVqu6KcsP/e612UiqS
+UMBmgdx9KPDDzZy4MJZC2hbfUoXj9A54mJN8cuEOPyw3c3yKOcq/h48KzVguQXi
SdJbwfqNIbQ9oJM+YzDjzS62+TCtNSNWzWbwABZCmuQxK0oEOSbTmbhxUF7rND3/
+mx9u8cY//7uAxLWYS5gIZlCbxcf0lkiKSHJB319
-----END CERTIFICATE-----
subject=/businessCategory=Private Organization/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/serialNumber=5157550/street=548 4th Street/postalCode=94107/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=github.com
issuer=/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1
---
No client certificate CA names sent
---
SSL handshake has read 4139 bytes and written 446 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 59D2883BBCE8E81E63E5551FAE7D1ACC00C49A9473C1618237BBBB0DD9016B8D
    Session-ID-ctx: 
    Master-Key: B6D2763FF29E77C67AD83296946A4D44CDBA4F37ED6F20BC27602F1B1A2D137FACDEAC862C11279C01095594F9776F79
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1393392673
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

请求/ openssl是否不应该知道在哪里可以找到有效的证书?

否。默认情况下,OpenSSL不信任任何内容。它与浏览器的模型相反,在默认情况下,几乎所有模型都是受信任的。


 $ openssl s_client -connect github.com:443 -CAfile `python -c 'import requests; print(requests.certs.where())'`
 ...
 >>> r = requests.get('https://github.com/', verify='path to cacert.pem file')

cacert.pem当您知道一个认证站点公钥的CA时,为什么还要信任数百个CA和从属CA(re :)?信任一个必需的根,仅此而已:DigiCert High Assurance EV CA-1

信任一切-就像在浏览器模型中一样-是在Diginotar根目录遭到破坏时,Comodo Hacker可以欺骗Gmail,Hotmail,Yahoo等证书的方式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python请求“证书验证失败”

来自分类Dev

Python请求“证书验证失败”

来自分类Dev

python 2.7.5请求和证书验证失败

来自分类Dev

python 2.7.5请求和证书验证失败

来自分类Dev

python请求特定SNI证书的“证书验证失败”

来自分类Dev

Python请求模块。SSL证书验证错误

来自分类Dev

Terraform自签名证书Openssl验证失败

来自分类Dev

Ruby和OpenSSL证书验证失败

来自分类Dev

Python请求SSL证书验证失败,即使添加CA证书也是如此

来自分类Dev

在带有自签名证书的Python中使用请求时,证书验证失败

来自分类Dev

PHPMailer 5.2 OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

来自分类Dev

由于证书无效或错误,POST 请求失败

来自分类Dev

解决“ ssl证书验证失败”错误

来自分类Dev

如何修复“SSL 错误:证书验证失败”

来自分类Dev

证书续订后,Ruby Net :: HTTP以OpenSSL :: SSL :: SSLError响应“证书验证失败”

来自分类Dev

CSRF验证错误失败。请求中止

来自分类Dev

AWS证书请求失败

来自分类Dev

请求(仅)*。google.com时,SSL3_GET_SERVER_CERTIFICATE证书在Python上验证失败

来自分类Dev

使用请求的Python SSL证书错误

来自分类Dev

相互证书身份验证失败,错误403.16

来自分类Dev

使用机械化获取证书验证失败的错误

来自分类Dev

Chrome中的SSL证书验证失败,Heartbleed错误?

来自分类Dev

python是否要求证书验证在Windows上需要openssl

来自分类Dev

请求,错误:无法验证第一个证书

来自分类Dev

由于证书错误,metrics-server 无法验证请求

来自分类Dev

python rfc3161验证失败,但openssl验证正常

来自分类Dev

谁在openSSL中验证证书

来自分类Dev

使用Ruby Gem'cryptsy-api'时,OpenSSL :: SSL :: SSLError“证书验证失败”

来自分类Dev

证书验证在与boost :: asio和OpenSSL的客户端服务器通信中失败

Related 相关文章

  1. 1

    Python请求“证书验证失败”

  2. 2

    Python请求“证书验证失败”

  3. 3

    python 2.7.5请求和证书验证失败

  4. 4

    python 2.7.5请求和证书验证失败

  5. 5

    python请求特定SNI证书的“证书验证失败”

  6. 6

    Python请求模块。SSL证书验证错误

  7. 7

    Terraform自签名证书Openssl验证失败

  8. 8

    Ruby和OpenSSL证书验证失败

  9. 9

    Python请求SSL证书验证失败,即使添加CA证书也是如此

  10. 10

    在带有自签名证书的Python中使用请求时,证书验证失败

  11. 11

    PHPMailer 5.2 OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

  12. 12

    由于证书无效或错误,POST 请求失败

  13. 13

    解决“ ssl证书验证失败”错误

  14. 14

    如何修复“SSL 错误:证书验证失败”

  15. 15

    证书续订后,Ruby Net :: HTTP以OpenSSL :: SSL :: SSLError响应“证书验证失败”

  16. 16

    CSRF验证错误失败。请求中止

  17. 17

    AWS证书请求失败

  18. 18

    请求(仅)*。google.com时,SSL3_GET_SERVER_CERTIFICATE证书在Python上验证失败

  19. 19

    使用请求的Python SSL证书错误

  20. 20

    相互证书身份验证失败,错误403.16

  21. 21

    使用机械化获取证书验证失败的错误

  22. 22

    Chrome中的SSL证书验证失败,Heartbleed错误?

  23. 23

    python是否要求证书验证在Windows上需要openssl

  24. 24

    请求,错误:无法验证第一个证书

  25. 25

    由于证书错误,metrics-server 无法验证请求

  26. 26

    python rfc3161验证失败,但openssl验证正常

  27. 27

    谁在openSSL中验证证书

  28. 28

    使用Ruby Gem'cryptsy-api'时,OpenSSL :: SSL :: SSLError“证书验证失败”

  29. 29

    证书验证在与boost :: asio和OpenSSL的客户端服务器通信中失败

热门标签

归档