Error response from daemon: Get "https://172.16.21.35/v2/": tls: failed to verify certificate: x509: certificate is valid for 127.0.0.1, ::1, 172.16.21.30, not 172.16.21.35
版本 v2.10.1-b7b88476 不需要从头看, 直接看最下面的成功的证书创建
这里面首先遇到的坑是 openssl版本太低, 需要先升级到 1.1.1
https://openssl-library.org/source/ 网站拿到最新版本 3.4wget https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz
tar -zxvf openssl-3.4.0.tar.gz
cd openssl-3.4.0
mv /usr/local/openssl /usr/local/openssl_bak
./config --prefix=/usr/local/opensslmakemake installmv /usr/bin/openssl /usr/bin/openssl_bak
mv /usr/include/openssl /usr/include/openssl_bakln -s /usr/local/openssl/bin/openssl /usr/bin/opensslln -s /usr/local/openssl/include/openssl /usr/include/openssl
上述config报错
Can't locate IPC/Cmd.pm in @INC (@INC contains: /etc/yum.repos.d/openssl-3.4.0/util/perl /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 . /etc/yum.repos.d/openssl-3.4.0/external/perl/Text-Template-1.56/lib) at /etc/yum.repos.d/openssl-3.4.0/util/perl/OpenSSL/config.pm line 19.
BEGIN failed--compilation aborted at /etc/yum.repos.d/openssl-3.4.0/util/perl/OpenSSL/config.pm line 19.
Compilation failed in require at /etc/yum.repos.d/openssl-3.4.0/Configure line 23.
BEGIN failed--compilation aborted at /etc/yum.repos.d/openssl-3.4.0/Configure line 23.解决办法: sudo yum install perl-IPC-Cmd
报错
openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory
openssl: error while loading shared libraries: libcrypto.so.3: cannot open shared object file: No such file or directory
解决办法
find / -name libssl.so.3找到
/usr/local/openssl/lib64/libssl.so.3创建软件链接sudo ln -sf /usr/local/openssl/lib64/libssl.so.3 /lib64/libssl.so.3sudo ln -sf /usr/local/openssl/lib64/libcrypto.so.3 /lib64/libcrypto.so.3
ssh 172.16.20.20
cd /opt/harbor
更新 /opt/harbor
目录中的证书,通常是指更新 Harbor 的 HTTPS 证书。以下是更新 Harbor 证书的详细步骤:
生成 dockerhub.kubekey.local.key
、dockerhub.kubekey.local.pem
和 dockerhub.kubekey.local-key.pem
这样的证书文件,通常是在生成自签名证书或证书签名请求(CSR)时进行的。根据您提供的文件名结构,它们可能涉及到私钥文件(.key
)、证书文件(.pem
)以及可能的密钥文件(.key.pem
)。下面是生成这些文件的步骤:
1. 生成私钥文件 (dockerhub.kubekey.local.key
)
生成私钥文件是生成 SSL 证书的第一步。使用 openssl
生成一个私钥文件。
根据 harbor.yml里面的配置
certificate: /etc/ssl/registry/ssl/dockerhub.kubekey.local.pem
private_key: /etc/ssl/registry/ssl/dockerhub.kubekey.local-key.pem
在目录 /etc/ssl/registry/ssl 清掉原来的文件, 重新生成
openssl genpkey -algorithm RSA -out dockerhub.kubekey.local.key -pkeyopt rsa_keygen_bits:2048
这个命令会生成一个 2048 位的 RSA 私钥,并将其保存为 dockerhub.kubekey.local.key
。
2. 生成证书签名请求(CSR) (dockerhub.kubekey.local.csr
)
使用私钥生成证书签名请求(CSR)。CSR 用于向证书颁发机构(CA)申请签名证书,或者生成自签名证书。
openssl req -new -key dockerhub.kubekey.local.key -out dockerhub.kubekey.local.csr
执行此命令时,您需要提供一些信息:
- Country Name (2 letter code): 国家代码,例如
CN
(中国)。 - State or Province Name: 省份名称。
- Locality Name: 城市名称。
- Organization Name: 公司名称。
- Organizational Unit Name: 部门名称。
- Common Name: 常见名称,通常是要为其创建证书的域名(例如
dockerhub.kubekey.local
)。 - Email Address: 联系邮箱。
- 随机密码: 8ZNDyM4cTzLkwG5w
生成的 dockerhub.kubekey.local.csr
将包含该域名的证书请求信息。
3. 生成自签名证书(.pem
和 .key.pem
)
如果您打算使用自签名证书,则可以使用 openssl
生成自签名证书。以下命令将生成 dockerhub.kubekey.local.pem
和 dockerhub.kubekey.local-key.pem
:
openssl req -x509 -key dockerhub.kubekey.local.key -in dockerhub.kubekey.local.csr -out dockerhub.kubekey.local.pem -days 3650
此命令会创建一个有效期为 365 天的自签名证书,并将其保存为 dockerhub.kubekey.local.pem
。
解释:
-x509
: 生成自签名证书。-key dockerhub.kubekey.local.key
: 使用之前生成的私钥文件。-in dockerhub.kubekey.local.csr
: 使用 CSR 文件。-out dockerhub.kubekey.local.pem
: 输出自签名证书文件。-days 365
: 设置证书有效期为 365 天。
4. 如果需要将证书和私钥合并为 .pem
格式
有时您可能需要将私钥和证书合并为一个 .pem
文件:
cat dockerhub.kubekey.local.key dockerhub.kubekey.local.pem > dockerhub.kubekey.local-key.pem
这会将私钥和证书文件合并成一个文件,命名为 dockerhub.kubekey.local-key.pem
。
执行以上步骤后,您应该会生成以下文件:
- dockerhub.kubekey.local.key:私钥文件。
- dockerhub.kubekey.local.csr:证书签名请求文件。
- dockerhub.kubekey.local.pem:自签名证书文件。
- dockerhub.kubekey.local-key.pem:合并后的证书和私钥文件。
5. 重启 Harbor 服务
在替换证书后,需要重启 Harbor 服务使新证书生效。
重启命令:
cd /opt/harborsudo docker-compose downsudo docker-compose up -d
验证服务状态:
sudo docker-compose ps
6. 验证证书是否生效
使用 curl
验证:
curl -v https://172.16.20.20
或通过浏览器访问:
打开浏览器访问 https://172.16.20.20
,查看证书是否为更新后的版本。
上面的替换没有生效, 检查docker-compose.yml文件 , 这里的nginx对外的端口是 443, https的端口, 先替换这里的证书 /mnt/registry/secret/cert
proxy:image: goharbor/nginx-photon:v2.10.1container_name: nginxrestart: alwayscap_drop:- ALLcap_add:- CHOWN- SETGID- SETUID- NET_BIND_SERVICEvolumes:- ./common/config/nginx:/etc/nginx:z- /mnt/registry/secret/cert:/etc/cert:z- type: bindsource: ./common/config/shared/trust-certificatestarget: /harbor_cust_certnetworks:- harborports:- 3880:8080- 443:8443depends_on:- registry- core- portal- loglogging:driver: "syslog"options:syslog-address: "tcp://localhost:1514"tag: "proxy"
在目录 /mnt/registry/secret/cert 重新生成这两个文件 server.crt server.key
cd /mnt/registry/secret/cert生成新的私钥文件(server.key)如下命令不要用, 生成的是 PKCS#8格式 比较短openssl genpkey -algorithm RSA -out /mnt/registry/secret/cert/server.key经过验证 如下命令生成的是 PKCS#1 格式 的私钥,
openssl genrsa -out server.key 2048生成新的证书请求文件(server.csr)openssl req -new -key /mnt/registry/secret/cert/server.key -out /mnt/registry/secret/cert/server.csrA challenge password: SmKc8QHpKBWu2RUJ生成自签名证书(server.crt)
openssl x509 -req -in /mnt/registry/secret/cert/server.csr -signkey /mnt/registry/secret/cert/server.key -out /mnt/registry/secret/cert/server.crt -days 36500最后生成文件列表server.crt server.csr server.key
然后重启harbor
cd /opt/harborsudo docker-compose downsudo docker-compose up -d
# 对于 Linux 客户端
将文件 /mnt/registry/secret/cert/server.crt 上传至 172.16.21.35:/etc/ssl/certsmv server.crt 172.16.20.20.server.crt然后更新
sudo update-ca-certificatesopenssl x509 -in /etc/ssl/certs/172.16.20.20.server.crt -noout -text
在172.16.21.35上验证证书
curl https://172.16.20.20 报错curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.htmlcurl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.cp ca.crt /etc/ssl/certs/172.16.20.20.server.crt
# 修改文件权限
sudo chmod 777 /etc/ssl/certs/172.16.20.20.server.crtcurl --cacert /etc/ssl/certs/172.16.20.20.server.crt https://172.16.20.20这条命令正常执行的curl -v https://172.16.20.20这条也是正常的curl https://172.16.20.20 也正常了 , 反而 curl --cacert /etc/ssl/certs/172.16.20.20.server.crt https://172.16.20.20 却不行了.
配置docker的自签证书
mkdir -p /etc/docker/certs.d/172.16.20.20
上传 server.crt 并命名 ca.crt
重启 docker生成 server.cert, 与 server.key 一并上传到目录 /etc/docker/certs.d/172.16.20.20openssl x509 -req -in server.csr -signkey server.key -out server.certsudo systemctl restart docker验证依然报错docker login 172.16.20.20
Username: admin
Password:
Error response from daemon: Get "https://172.16.20.20/v2/": tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead使用如下方法生成: openssl req -newkey rsa:4096 -nodes -sha256 -keyout server.key -x509 -days 36500 -out server.crt -addext "subjectAltName = DNS:172.16.20.20"
登陆docker harbor遇到报错
root@master:/etc/docker/certs.d# docker login 172.16.20.20
Username: admin
Password:
Error response from daemon: Get "https://172.16.20.20/v2/": tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead
在上述生成证书的基础上 增加一个配置
vi openssl.cnf
[req]
default_bits = 2048
default_keyfile = server.key
distinguished_name = req_distinguished_name
req_extensions = v3_req
x509_extensions = v3_ca
string_mask = utf8only[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = California
localityName = Locality Name (eg, city)
localityName_default = San Francisco
organizationalName = Organization Name (eg, company)
organizationalName_default = Example Inc.
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = 172.16.20.20
commonName_max = 64[v3_req]
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names[alt_names]
DNS.1 = 172.16.20.20
IP.1 = 172.16.20.20
生成包含 SAN 的证书
openssl genrsa -out server.key 2048生成证书请求 (CSR)
openssl req -new -key server.key -out server.csr -config openssl.cnf自签署证书并加入 SANopenssl x509 -req -in server.csr -signkey server.key -days 36500 -out server.crt -extensions v3_req -extfile openssl.cnf经过这次重新设置, 生效了, 主要是把原来的 证书全部删除然后生成chmod 777 server*