Artifactory对接Docker Hub时SSL证书问题排查求助
问题背景
本地部署Artifactory 6.x,创建指向Docker Hub(https://registry-1.docker.io/v2/)的远程仓库并加入虚拟仓库,执行docker pull时报错:
error pulling image configuration: download failed after attempts=1: unknown blob
清理缓存无效,查看Artifactory日志发现证书路径错误:
2024-04-19 15:32:03,099 [http-nio-8081-exec-7] [WARN ] (o.a.r.RemoteRepoBase:437) - dockerhub: Error in getting information for 'jfrogecosystem/jfrog-setup-cli/2.0.0/sha256__xxxxxxxxxxxxxxxxxxxxxxxxxx' (Failed retrieving resource from https://registry-1.docker.io/v2/jfrogecosystem/jfrog-setup-cli/blobs/sha256:xxxxxxxxxxxxxxxxxxxxxxx: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target)
已导入根/中间/服务器证书到Artifactory的Java密钥库,但问题依旧。
排查与解决步骤
确认证书导入至正确的密钥库
Artifactory 6.x默认使用自带JRE,密钥库路径为$ARTIFACTORY_HOME/jre/lib/security/cacerts,而非系统JVM的密钥库。执行以下命令验证证书是否存在:keytool -list -keystore $ARTIFACTORY_HOME/jre/lib/security/cacerts -storepass changeit | grep <你的证书别名>若未找到,需重新将证书导入该路径的密钥库。
检查证书链完整性
Docker Hub的证书链包含根CA、中间CA和服务器证书,必须完整导入且顺序正确(先根CA,再中间CA,最后服务器证书)。可通过以下命令获取完整证书链:openssl s_client -connect registry-1.docker.io:443 -showcerts将输出中的每个证书(从
-----BEGIN CERTIFICATE-----到-----END CERTIFICATE-----)保存为单独的.crt文件,再依次导入密钥库。重启Artifactory使配置生效
证书导入后必须重启Artifactory服务,否则JVM不会加载更新后的密钥库:# systemd环境 systemctl restart artifactory # 手动启动环境 $ARTIFACTORY_HOME/bin/artifactoryctl restart排查代理配置(若使用代理)
若Artifactory通过代理访问Docker Hub,需将代理的证书也导入密钥库;或在远程仓库的代理配置中确认证书验证设置(生产环境不建议禁用验证)。验证服务器层面的证书信任
在Artifactory所在服务器执行curl测试,确认服务器本身能信任Docker Hub的证书:curl -v https://registry-1.docker.io/v2/jfrogecosystem/jfrog-setup-cli/blobs/sha256:xxxxxxxxxxxxxxxxxxxxxxx若curl返回证书错误,需先解决系统层面的证书信任问题(将证书导入系统信任库,如
/etc/pki/ca-trust/source/anchors/并更新信任)。修正远程仓库URL配置
远程仓库的URL应设置为https://registry-1.docker.io(无需添加/v2/后缀),Artifactory会自动处理路径映射。同时确认"Enable Token Authentication"选项已开启,Docker Hub需要令牌认证访问部分镜像。
内容的提问来源于stack exchange,提问作者gil

