OpenShift拉取Harbor镜像失败:x509未知权威证书签名错误
问题描述
- Deployment包含两个镜像:
redis:alpine:拉取正常- 私有Harbor仓库镜像:OpenShift拉取失败
- Harbor使用非自签名SSL证书,本地以容器身份可正常登录、拉取/推送镜像,但OpenShift拉取时报错:
Failed to pull image <myregistry.net
> : rpc error: code = Unknown desc = pinging container registry myregistry.net: Get "https:// .net/v2/": x509: certificate signed by unknown authority
- 本地
/etc/docker/certs.d/myregistry目录存在ca.crt,已尝试官方文档的ConfigMap添加CA方法,但未生效
解决方案
1. 确认CA证书完整性
确保使用的ca.crt是Harbor仓库的完整根CA证书链(若证书由中间CA签发,需包含根CA+中间CA的完整链),可通过以下命令生成完整链证书:
openssl s_client -connect myregistry.net:443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM > full-chain.crt
后续操作使用生成的full-chain.crt替换原有ca.crt。
2. 配置集群级可信CA
OpenShift 4.x仅给Builds添加CA可能无效,需将CA注入集群节点可信存储:
- 创建包含CA证书的ConfigMap:
oc create configmap harbor-ca --from-file=ca.crt=./full-chain.crt -n openshift-config
- 更新集群Proxy配置,绑定可信CA:
oc patch proxy/cluster --type=merge --patch='{"spec":{"trustedCA":{"name":"harbor-ca"}}}'
- 等待节点更新完成,查看节点状态确认:
oc get nodes
所有节点状态变为Ready后,重新触发镜像拉取。
3. 为命名空间配置镜像拉取Secret(可选)
若集群级配置仍不生效,在Deployment所在命名空间创建拉取Secret:
- 创建Secret(替换占位符内容):
oc create secret docker-registry harbor-secret \ --docker-server=myregistry.net \ --docker-username=<harbor-用户名> \ --docker-password=<harbor-密码> \ --docker-email=<你的邮箱> \ --from-file=.dockerconfigjson=~/.docker/config.json \ -n <你的命名空间>
- 修改Deployment,添加镜像拉取Secret引用:
spec: template: spec: imagePullSecrets: - name: harbor-secret
4. 验证节点CA同步状态
登录任意集群节点,检查/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem是否包含Harbor的CA证书内容,若未包含则手动同步:
update-ca-trust extract
注意事项
- 确保Harbor域名在OpenShift集群内部可正常解析,避免DNS问题导致证书验证失败
- 若使用OpenShift 3.x,需将CA证书添加到
/etc/origin/node/pki/ca-bundle.crt并重启节点服务
内容的提问来源于stack exchange,提问作者Murat Karaselcuk
相关产品推荐
相关产品推荐

