我使用docker-compose部署的harbor镜像仓库,nerdctl可以正常访问,只需要把域名开头的crt证书写入到/etc/pki/tls/certs/ca-bundle.crt文件即可,如:
[root@node02 certs.d]# chmod 644 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
[root@node02 certs.d]# cat /app/harbor/certs.d/core.harbor.domain.crt >> /etc/pki/tls/certs/ca-bundle.crt
[root@node02 certs.d]# chmod 444 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
[root@node02 certs.d]# nerdctl login -u admin -p Harbor12345 https://core.harbor.domain
WARN[0000] WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
[root@node02 certs.d]#
但是我在k8s上使用helm部署的harbor,nerdctl就访问不了,两者创建的证书的命令完全一致,且也进行了上述将证书添加到可信的操作,每次都提示证书不被信任。
不知道你这个问题是否已经解决, 如果还没有解决的话:这个问题的原因是在 Kubernetes 中使用 Helm 部署的 Harbor 无法信任证书,可能是因为证书链不完整或者是配置问题。
下面是一些可能的解决方案:
确保证书链完整
检查在 Helm 部署 Harbor 时使用的证书是否是完整的证书链。可以通过自签名证书生成工具(如 OpenSSL)生成完整的证书链。
请确保 Harbor 使用的证书包含所有必需的中间和根证书,以便客户端可以正确验证证书。
验证 Harbor 配置
检查 Helm 安装 Harbor 时提供的配置参数,确保使用了正确的证书路径和证书文件名。
检查 Harbor 的 Ingress 配置是否正确,并且证书文件名与实际证书文件名匹配。
添加证书到 Kubernetes 信任证书池中
使用 kubectl
命令创建 Kubernetes Secret,将证书添加到信任证书池中。可以使用以下命令将证书添加到 Secret 中:
shell kubectl create secret generic harbor-cert --from-file=/app/harbor/certs.d/core.harbor.domain.crt
确保 Secret 的名称和路径与实际证书文件匹配。
然后,在 Harbor 的 Deployment 或 Pod 的 YAML 文件中,将上面创建的 Secret 挂载到容器的某个目录(例如 /etc/ssl/certs
)。
yaml ... spec: volumes: - name: harbor-cert secret: secretName: harbor-cert containers: - name: harbor volumeMounts: - name: harbor-cert mountPath: /etc/ssl/certs readOnly: true ...
这样,容器在启动时将自动加载加入到 Kubernetes 信任证书池中的证书。
使用特定的证书信任配置
检查 Nerdctl 的证书信任配置。可以尝试将 Harbor 证书的路径配置添加到 Nerdctl 的证书信任配置文件中。
shell ~/.config/nerdctl/config.toml
toml [plugins."io.containerd.grpc.v1.cri".registry.configs."core.harbor.domain".tls] ca_file = "/path/to/core.harbor.domain.crt"
/path/to/core.harbor.domain.crt
是正确的 Harbor 证书路径。如果以上解决方案都不能解决问题,请尝试生成一个全新的可信证书,并在 Harbor 部署时使用该证书,确保证书链完整和正确。