我正在使用 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)')))
建议我解决此问题的可能方法。 谢谢!
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-----
从这样的公共网站获取类似的证书问题(链中的自签名证书)闻起来就像您在公司代理后面。是这样吗?
您可以简单地检查您是否从家里或热点连接到互联网,而无需通过代理。如果它有效 - 那么这就是你的问题。
您还可以进一步运行调试它
curl -v <URL>
。它将显示一些附加的证书信息。
要解决此问题,您需要信任您的公司 CA 证书,以便信任此根 CA 签名的证书。这是在 Ubuntu 上实现的方法
导入公司证书通常是 IT 部门帮助完成的事情。不同操作系统之间的过程有所不同,但总的来说(我将在下面给出一个 Linux 示例),过程是这样的:
.crt
后缀/usr/local/share/ca-certificates
sudo update-ca-certificates
更新操作系统证书如果您在 Docker 中运行,该过程是相同的,但根据操作系统类型,它可能会有所不同。
我们在另一个 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
包。
YOUR域名吗?
从错误来看,您似乎正在尝试在请求中使用虚构域名my-domain.atlassian.net
和
your-domain.atlassian.net
。
ping <your-domain>.atlassian.net
并确保它可以通过
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