sudo cp harbor.crt /usr/local/share/ca-certificates/sudo yum install -y ca-certificatessudo update-ca-trust force-enablesudo update-ca-trust extract
但是访问 https://172.16.20.20 仍然报错 * About to connect() to 172.16.20.20 port 443 (#0) * Trying 172.16.20.20... * Connected to 172.16.20.20 (172.16.20.20) port 443 (#0) * Initializing NSS with certpath: sql:/etc/pki/nssdb * CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none * Server certificate: * subject: CN=registry-1.docker.io,L=NanJing,ST=JiangSu,C=CN * start date: Dec 20 08:54:50 2024 GMT * expire date: Nov 26 08:54:50 2124 GMT * common name: registry-1.docker.io * issuer: CN=registry-1.docker.io,L=NanJing,ST=JiangSu,C=CN * NSS error -8156 (SEC_ERROR_CA_CERT_INVALID) * Issuer certificate is invalid. * Closing connection 0 curl: (60) Issuer certificate is invalid. More details here: http://curl.haxx.se/docs/sslcerts.html curl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alternate file using the --cacert option. If this HTTPS server uses a certificate signed by a CA represented in the bundle, the certificate verification probably failed due to a problem with the certificate (it might be expired, or the name might not match the domain name in the URL). If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option.
根据你提供的信息,问题可能出在以下几个方面:
问题分析
-
证书未正确安装: 证书复制到了
/usr/local/share/ca-certificates
后,需要更新 CA 信任链,但可能存在以下问题:- 文件扩展名需为
.crt
才能被正确识别。 sudo update-ca-trust extract
是否成功执行。
- 文件扩展名需为
-
证书的域名或 IP 不匹配: 你的证书的
common name
(CN) 为registry-1.docker.io
,而你尝试访问的是https://172.16.20.20
,域名和 IP 不匹配可能导致证书验证失败。 -
证书链不完整或签发机构问题: 如果证书的签发机构未被系统信任,或证书链中缺少中间证书,也会导致
SEC_ERROR_CA_CERT_INVALID
错误。 -
NSS 库的问题: CentOS 使用 NSS 库验证证书,可能存在特定配置导致问题。[最终确定是这个问题, 最后一步解决了此问题]
解决步骤
1. 确保证书正确安装
执行以下命令:
sudo cp harbor.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
这会将证书添加到系统信任链。
然后检查证书是否已被信任:
openssl x509 -in harbor.crt -text -noout
sudo grep "subject=" /etc/pki/tls/certs/ca-bundle.crt | grep "CN=registry-1.docker.io"
如果找不到对应的 CN
信息,说明证书未正确安装。
2. 使用正确的域名访问
修改 /etc/hosts
文件,将域名指向 IP 地址,确保域名和证书匹配:
sudo vi /etc/hosts
添加以下内容:
172.16.20.20 registry-1.docker.io
然后重新访问:
curl https://registry-1.docker.io
3. 检查证书链
验证证书的完整性:
openssl verify -CAfile harbor.crt harbor.crt
如果提示证书链不完整,可能需要下载并合并中间证书。例如:
cat harbor.crt intermediate.crt > fullchain.crt
然后重新复制到 /etc/pki/ca-trust/source/anchors/
并更新信任链。
4. 调试和验证
尝试使用 curl
调试:
curl -v --cacert harbor.crt https://172.16.20.20
如果继续失败,可以临时使用 -k
忽略验证(仅供测试):
curl -k https://172.16.20.20
5. 检查 NSS 数据库
如果问题依旧,可以重置 NSS 数据库:
sudo mv /etc/pki/nssdb /etc/pki/nssdb_bak
sudo rm -rf /etc/pki/nssdb
sudo mkdir /etc/pki/nssdb
sudo certutil -N -d sql:/etc/pki/nssdb
sudo certutil -A -d sql:/etc/pki/nssdb -n "harbor" -t "C,," -i harbor.crt
验证 NSS 配置:
cat harbor.crt harbor.key > harbor.pemcurl --cert harbor.pem https://172.16.20.20
通过以上步骤,问题应能解决。如果仍然报错,可以提供更多详细日志或上下文以便进一步分析。
如果还是解决不了问题, 使用 curl-config --ca 查看使用哪个路径的证书, 或者使用 curl https://172.16.20.20 --verbose 查看调用证书的路径明细, 直接将我们的证书写入实际使用的证书即可, 比如 实际使用的证书路径是 /etc/ssl/certs/ca-certificates.crt
那么使用如下命令追加证书
cat harbor.crt >> /etc/ssl/certs/ca-certificates.crt