SSL:CERTIFICATE_VERIFY_FAILED 证书验证失败:证书链中的自签名证书 (_ssl.c:992)

问题描述 投票:0回答:5

我正在使用 python 向 jira cloud Rest api 发出 get 请求以获取问题的详细信息,但收到此 SSL 验证失败错误消息,我正在使用此脚本

import requests
import json

url = "https://your-domain.atlassian.net/rest/agile/1.0/issue/{issueIdOrKey}"

headers = {
  "Accept": "application/json",
  "Authorization": "Bearer <access_token>"
}

response = requests.request(
   "GET",
   url,
   headers=headers
)

print(json.dumps(json.loads(response.text), sort_keys=True, indent=4, separators=(",", ": ")))

错误信息-

requests.exceptions.SSLError: HTTPSConnectionPool('host=your-domain.atlasian.net', port=443): 最大 网址重试次数超出:/rest/agile/1.0/issue/{issueIdOrKey} (由 SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:自签名 证书链中的证书 (_ssl.c:992)')))

建议我解决此问题的可能方法。 谢谢!

python ssl ssl-certificate jira-rest-api
5个回答
4
投票

self signed certificate in certificate chain
表示证书链验证失败。您的脚本不信任该证书或其颁发者之一。有关更多信息,请参阅平台工程师从 SSL 开始Tzane 的答案已经满足了你的大部分需求。 但看起来您可能还想知道要添加什么证书。

因此,首先通过在命令行上运行以下命令来获取 CA 证书和任何中间证书:

openssl s_client -connect your-name.atlassian.net:443 -showcerts

在输出中,有一个以

Certificate chain
开头的块。我从 Atlassian.net 获得的输出只有服务器证书和 CA 证书。

有一些输出块以

开头
-----BEGIN CERTIFICATE-----

并以

结束
-----END CERTIFICATE-----

这些块,包括我刚才显示的行,是一个证书。 复制最后一个证书并创建一个 pem 文件,例如

ca-root.pem
。将其放在与 python 文件相同的目录中,然后将请求块更新为:

verify = "ca-root.pem"

response = requests.request(
   "GET",
   url,
   headers=headers,
   verify=verify
)

希望这有帮助。

-----更新-----

使用您提供的域名,

msci.atlassian.net
,我此时拥有 Digital Cert 提供的 CA 证书。

-----BEGIN CERTIFICATE-----
MIIEvjCCA6agAwIBAgIQBtjZBNVYQ0b2ii+nVCJ+xDANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaME8xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxKTAnBgNVBAMTIERpZ2lDZXJ0IFRMUyBS
U0EgU0hBMjU2IDIwMjAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAwUuzZUdwvN1PWNvsnO3DZuUfMRNUrUpmRh8sCuxkB+Uu3Ny5CiDt3+PE0J6a
qXodgojlEVbbHp9YwlHnLDQNLtKS4VbL8Xlfs7uHyiUDe5pSQWYQYE9XE0nw6Ddn
g9/n00tnTCJRpt8OmRDtV1F0JuJ9x8piLhMbfyOIJVNvwTRYAIuE//i+p1hJInuW
raKImxW8oHzf6VGo1bDtN+I2tIJLYrVJmuzHZ9bjPvXj1hJeRPG/cUJ9WIQDgLGB
Afr5yjK7tI4nhyfFK3TUqNaX3sNk+crOU6JWvHgXjkkDKa77SU+kFbnO8lwZV21r
eacroicgE7XQPUDTITAHk+qZ9QIDAQABo4IBgjCCAX4wEgYDVR0TAQH/BAgwBgEB
/wIBADAdBgNVHQ4EFgQUt2ui6qiqhIx56rTaD5iyxZV2ufQwHwYDVR0jBBgwFoAU
A95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG
CCsGAQUFBwMBBggrBgEFBQcDAjB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGG
GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0aHR0cDovL2Nh
Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNydDBCBgNV
HR8EOzA5MDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRH
bG9iYWxSb290Q0EuY3JsMD0GA1UdIAQ2MDQwCwYJYIZIAYb9bAIBMAcGBWeBDAEB
MAgGBmeBDAECATAIBgZngQwBAgIwCAYGZ4EMAQIDMA0GCSqGSIb3DQEBCwUAA4IB
AQCAMs5eC91uWg0Kr+HWhMvAjvqFcO3aXbMM9yt1QP6FCvrzMXi3cEsaiVi6gL3z
ax3pfs8LulicWdSQ0/1s/dCYbbdxglvPbQtaCdB73sRD2Cqk3p5BJl+7j5nL3a7h
qG+fh/50tx8bIKuxT8b1Z11dmzzp/2n3YWzW2fP9NsarA4h20ksudYbj/NhVfSbC
EXffPgK2fPOre3qGNm+499iTcc+G33Mw+nur7SpZyEKEOxEXGlLzyQ4UfaJbcme6
ce1XR2bFuAJKZTRei9AqPCCcUZlM51Ke92sRKw2Sfh3oius2FkOH6ipjv3U/697E
A7sKPPcw7+uvTPyLNhBzPvOk
-----END CERTIFICATE-----

1
投票

从这样的公共网站获取类似的证书问题(链中的自签名证书)闻起来就像您在公司代理后面。是这样吗?

您可以简单地检查您是否从家里或热点连接到互联网,而无需通过代理。如果它有效 - 那么这就是你的问题。

您还可以进一步运行调试它

curl -v <URL>
。它将显示一些附加的证书信息。

要解决此问题,您需要信任您的公司 CA 证书,以便信任此根 CA 签名的证书。这是在 Ubuntu 上实现的方法


导入公司证书通常是 IT 部门帮助完成的事情。不同操作系统之间的过程有所不同,但总的来说(我将在下面给出一个 Linux 示例),过程是这样的:

  1. 您需要获取根CA证书。这是公司签署证书所用的证书。您的 IT 部门可能会拥有它,或者您可以从中获取它的知识。这是一个带有
    .crt
    后缀
  2. 的文件
  3. 您可以将此文件放在指定位置,具体取决于您的操作系统。对于 Ubuntu,这将是
    /usr/local/share/ca-certificates
  4. 运行
    sudo update-ca-certificates
    更新操作系统证书

如果您在 Docker 中运行,该过程是相同的,但根据操作系统类型,它可能会有所不同。


1
投票

我们在另一个 Web API 上遇到了类似的证书问题,该问题在某些计算机上随机出现。我们最终要做的是从 Let's Encrypt 获取ISRG Root X1 并手动将其传递给请求

verify = "isrgrootx1.pem" response = requests.request( "GET", url, headers=headers, verify=verify )

更新

如果您使用的是 >= Python 3.10,使用

truststore 也是一个不错的选择。它允许您使用操作系统本机“证书存储”而不是 certifi

 包。


0
投票
您在请求中使用

YOUR域名吗?

从错误来看,您似乎正在尝试在请求中使用虚构域名

my-domain.atlassian.net

your-domain.atlassian.net


0
投票
    尝试做
  1. ping <your-domain>.atlassian.net
    并确保它可以通过
  2. 如果您使用 VPN,请尝试将其关闭,因为 VPN 可以执行自签名证书,从而导致各种问题
  3. 否则请检查 python 使用的环境变量...附上我们在处理这些问题时使用的简短脚本
if [ -w /etc/ssl/certs ] then CERT_PATH=/etc/ssl/certs/certs.pem else CERT_PATH=~/.certs.pem fi security export -t certs -f pemseq -k login.keychain-db -o $CERT_PATH echo "\nexport REQUESTS_CA_BUNDLE=$CERT_PATH" >> ~/.bash_profile echo "\nexport REQUESTS_CA_BUNDLE=$CERT_PATH" >> ~/.zshrc
    
© www.soinside.com 2019 - 2024. All rights reserved.