登录harbor时的SSL异常: x509: certificate is valid for ingress.local

背景

之前搭建了一套内网环境的harbor,绑定了一个harbor.test.com的域名。现在因为工作需要,给这个harbor服务绑定了一个公网域名,并且申请了SSL证书,在调整完docker-composeharbor.yml以及docker-compose.yml文件内的证书后,可以通过浏览器访问,并且显示SSL握手成功。在这里插入图片描述
但是通过docker命令行登录时,却抛出如下异常:

Error response from daemon: Get "https://harbor.oulaoula.com/v2/": Get "https://harbor.mudamuda.com/service/token?account=jojo&client_id=docker&offline_token=true&service=harbor-registry": x509: certificate is valid for ingress.local, not harbor.mudamuda.com

原因

在hardor的docker-compose中,有一个core组件,定义了harbor的端点,所以需要把${harbor-docker-compose-dir}/common/config/core/env文件中的EXT_ENDPOINT字段的值定义为新的公网域名,并重启harbor服务。

在处理 Harbor OAuth 令牌获取失败的问题,错误信息 `failed to fetch oauth token: tls: verify certificate: x509: certificate valid for core.harbor.domain, not harbor.kccp.ksyun.com` 表明客户端尝试访问 `harbor.kccp.ksyun.com`,但服务器提供的 TLS 证书仅对 `core.harbor.domain` 有效,导致证书验证失败[^1]。 ### 问题分析 TLS 证书的验证失败通常涉及以下几个方面: 1. **证书域名不匹配**: - 提供的证书仅对 `core.harbor.domain` 有效,而客户端尝试访问的是 `harbor.kccp.ksyun.com`。 - TLS 证书中的 Subject Alternative Name (SAN) 或 Common Name (CN) 必须包含客户端使用的域名。 2. **证书有效期问题**: - 证书的有效期可能已过,或者证书签发间与系统间不匹配。 3. **证书信任链问题**: - 如果证书不是由受信任的 CA 签发的,或者中间证书未正确配置,也可能导致验证失败。 4. **自签名证书处理**: - 如果使用的是自签名证书,则需要在客户端信任该证书或在请求禁用证书验证(不推荐用于生产环境)。 ### 解决方案 #### 1. 确保证书包含正确的域名 如果使用的是自签名证书或内部 CA 签发的证书,请确保在生成证书,证书中包含客户端访问的域名。可以使用类似以下命令生成证书: ```bash chmod +x create_self-signed-cert.sh ./create_self-signed-cert.sh --ssl-domain=harbor.kccp.ksyun.com --ssl-trusted-ip=172.16.3.241,172.16.3.242,172.16.3.243 --ssl-size=2048 --ssl-date=3650 ``` 确保 `--ssl-domain` 参数中包含 `harbor.kccp.ksyun.com`,以便证书验证通过[^1]。 #### 2. 验证证书 SAN 或 CN 字段 使用以下命令检查证书的 SAN 或 CN 字段是否包含所需的域名: ```bash openssl x509 -in tls.crt -text -noout ``` 在输出中查找 `Subject Alternative Name` 或 `Common Name` 字段,确认其中包含 `harbor.kccp.ksyun.com`。 #### 3. 在客户端信任证书 如果使用的是自签名证书,则需要在客户端将证书添加到信任存储中。例如,在 Linux 系统上,可以将证书复制到 `/usr/local/share/ca-certificates/` 并运行: ```bash sudo update-ca-certificates ``` #### 4. 禁用证书验证(仅用于测试) 在测试环境中,可以通过禁用 TLS 验证来绕过证书问题。例如,在 Docker 客户端中,可以编辑 `/etc/docker/daemon.json` 并添加: ```json { "insecure-registries": ["harbor.kccp.ksyun.com"] } ``` 然后重启 Docker 服务: ```bash sudo systemctl restart docker ``` 注意:这种方法不适用于生产环境,因为它会降低安全性。 #### 5. 检查间同步问题 确保客户端和服务器的间同步。间偏差过大可能导致证书被认为无效。可以使用 `ntpdate` 或 `chronyd` 来同步间。 ### 示例代码:使用 Go 发送 HTTPS 请求并跳过证书验证(仅用于测试) ```go package main import ( "fmt" "net/http" "crypto/tls" ) func main() { tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr} resp, err := client.Get("https://harbor.kccp.ksyun.com") if err != nil { fmt.Println("Error:", err) return } defer resp.Body.Close() fmt.Println("Response status:", resp.Status) } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值