企业环境下使用Twine上传至Artifactory时解决证书错误
解决Twine上传Python包到HTTPS Artifactory的SSL证书验证失败问题
问题场景
本地使用Twine上传Python包至启用HTTPS的Artifactory服务器,执行命令:
twine upload --verbose \ --repository-url https://URL/artifactory/api/pypi/PATH \ --username XX \ --password XX \ dist/*
触发SSL验证错误:
requests.exceptions.SSLError: HTTPSConnectionPool(host='URL', port=443): Max retries exceeded with url: /artifactory/api/pypi/PATH (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)')))
尝试添加--cert参数指定下载的cert.pem文件:
twine upload --verbose \ --repository-url https://URL/artifactory/api/pypi/PATH \ --username XX \ --password XX \ --cert ../../bin/cert.pem \ dist/*
但仍报错:
certificate verify failed: unable to get local issuer certificate
需在不禁用SSL检查的前提下解决该问题。
正确解决步骤
1. 获取完整的证书链
单独的服务器证书可能缺少上级颁发机构的证书,导致验证失败。需导出Artifactory服务器的完整证书链:
- 用浏览器访问Artifactory的HTTPS地址,点击地址栏锁图标查看证书详情
- 依次导出服务器证书、中间CA证书、根CA证书,将它们合并到同一个PEM文件中(顺序:服务器证书在前,中间CA次之,根CA最后)
2. 准确指定证书路径
确保--cert参数指向包含完整证书链的PEM文件,建议使用绝对路径避免相对路径错误:
twine upload --verbose \ --repository-url https://URL/artifactory/api/pypi/PATH \ --username XX \ --password XX \ --cert /绝对路径/完整证书链文件.pem \ dist/*
3. 配置全局证书(可选)
若不想每次命令都加--cert参数,可选择以下方式之一:
- 将完整证书链添加到系统信任证书库:
- Windows:通过「证书管理器」导入证书并设置为受信任
- Linux:将证书文件拷贝至
/etc/ssl/certs目录,执行update-ca-certificates更新 - macOS:通过「钥匙串访问」导入证书,设置信任级别为「始终信任」
- 设置Python环境变量
REQUESTS_CA_BUNDLE指向证书文件:
设置后,Twine会自动使用该证书验证,无需再添加# Linux/macOS终端 export REQUESTS_CA_BUNDLE=/绝对路径/完整证书链文件.pem # Windows CMD set REQUESTS_CA_BUNDLE=C:\绝对路径\完整证书链文件.pem # Windows PowerShell $env:REQUESTS_CA_BUNDLE = "C:\绝对路径\完整证书链文件.pem"--cert参数。
4. 验证证书有效性
用openssl命令测试证书链是否有效:
openssl s_client -connect URL:443 -CAfile /绝对路径/完整证书链文件.pem
若输出包含Verify return code: 0 (ok),则证书链验证通过。
内容的提问来源于stack exchange,提问作者Itération 122442
相关产品推荐
相关产品推荐

