Harbor上传镜像报错

1、报错信息

1
2
3
4
5
[root@node1 ~]# ctr -n k8s.io image  push   35.220.201.102/jenkins/jnlp:v2
manifest-v2@sha256:db2a2bc65b2c7e20bc119ff1701fb9c9e78143c7db76a7e0c04951e01a0c2b91: waiting |--------------------------------------|
config-sha256:0c852de605fd61c135c5b189639bc0d2b244128deb5bff72229a4d4f0ecf52f3: waiting |--------------------------------------|
elapsed: 0.2 s total: 0.0 B (0.0 B/s)
ctr: failed to do request: Head "https://35.220.201.102/v2/jenkins/jnlp/blobs/sha256:49764daf48852f221675330d5296c17b35392c3af1ea02173e8b6ca38bd302f9": x509: cannot validate certificate for 35.220.201.102 because it doesn't contain any IP SANs

Docker 客户端尝试连接的 Harbor 服务器 SSL/TLS 证书中只使用了“Common Name”字段。在过去,SSL/TLS 证书中使用“Common Name”字段来指定 SSL/TLS 证书所保护的主机名或域名。然而,现在这种做法已经被视为不够安全,因为它容易受到 DNS 劫持、伪造证书等攻击。

为了解决这个问题,您需要为您的 Harbor 服务器生成一个新的 SSL/TLS 证书,并在证书中添加正确的“Subject Alternative Names”(SAN)字段。

subjectAltName(Subject Alternative Name)是用于 SSL/TLS 证书中的一个扩展属性,它允许您在证书中指定可使用的主机名或 IP 地址列表。在过去,SSL/TLS 证书中只能包含一个“Common Name”字段,这个字段通常用于指定 SSL/TLS 证书所保护的主机名或域名。

然而,随着互联网发展,越来越多的网站需要使用不同的主机名或 IP 地址来提供服务。为了解决这个问题,subjectAltName 扩展属性被引入到 SSL/TLS 证书中,它允许您在证书中指定一个或多个可使用的主机名和 IP 地址。

具体来说,subjectAltName 可以包含以下类型的信息:

  • DNS 名称:可以是完全限定的域名、通配符域名或本地主机名。
  • IP 地址:可以是 IPv4 或 IPv6 地址。
  • 其他类型:例如电子邮件地址、URI(统一资源标识符)等。

当客户端连接到使用 SSL/TLS 证书的服务器时,将会首先检查该证书中的 subjectAltName 是否包含所请求的主机名或 IP 地址。如果匹配成功,则客户端会信任该证书并建立安全连接,否则将拒绝连接并显示警告信息。

总之,subjectAltName 扩展属性允许您在 SSL/TLS 证书中指定多个可使用的主机名或 IP 地址,以便提供更加灵活和安全的服务。

2、解决方法

2.1 生成新的证书文件

使用 OpenSSL 工具为您的 Harbor 服务器生成一个新的 SSL/TLS 证书。例如,以下命令可以生成一个有效期为 3650天的自签名证书:

其中,mykey.pem 是私钥文件的名称,mycert.pem 是证书文件的名称,3650表示证书有效期为 3650天。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@harbor ssl]# cat openssl.cnf 
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[req_distinguished_name]

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = 36.152.143.114
IP.1 = 36.152.143.114

2.2 添加字段

在证书中添加正确的“Subject Alternative Names”(SAN)字段。可以使用 OpenSSL 的 reqexts 选项来完成这个任务。例如,以下命令可以为您的 Harbor 服务器的 IP 地址和主机名添加“Subject Alternative Names”字段

1
openssl req -new -key mykey.pem -out myreq.csr -subj "/CN=harbor" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=IP:35.220.201.102,DNS:harbor"))

2.3 更改harbor的配置文件

将证书的路径改成刚才生成的

1
2
3
[root@harbor harbor]# cat harbor.yml |grep data/ssl
certificate: /data/ssl/mycert.pem
private_key: /data/ssl/mykey.pem

2.4 重启Harbor服务

1
2
docker-compose down -v
docker-compose up -d