番摊机器人 自建 HTTPS 证书的 Harbor 镜像仓库

搭建基于自建 HTTPS 证书的 Harbor 镜像仓库,主要包含生成 CA 根证书、生成服务器证书、配置 Harbor 以及客户端信任证书四个核心步骤。以下是详细的操作指南:


1. 前期准备与域名映射


在生成证书前,需要确定 Harbor 服务器的 IP 地址和访问域名。为了便于测试,通常使用 hosts 文件进行域名映射。


假设 Harbor 服务器 IP 为 192.168.9.200,域名为 reg.harbor.local。


在 Harbor 服务器及所有需要访问该仓库的客户端机器上执行:


bash

echo "192.168.9.200 reg.harbor.local" >> /etc/hosts


2. 生成 CA 根证书


CA 证书用于签署服务器证书,建立信任链。


创建一个目录存放证书文件,例如 /data/certs:


bash

mkdir -p /data/certs

cd /data/certs



生成 CA 私钥:


bash

openssl genrsa -out ca.key 4096



生成 CA 根证书(有效期设为 3650 天,可根据需求调整):


bash

openssl req -x509 -new -nodes -sha512 -days 3650 \

 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=reg.harbor.local" \

 -key ca.key \

 -out ca.crt



注意:CN 字段建议填写你的域名或 IP。


3. 生成服务器证书


服务器证书需要包含 Subject Alternative Name (SAN) 扩展,以支持域名和 IP 访问。


3.1 生成服务器私钥‌


bash

openssl genrsa -out reg.harbor.local.key 4096



3.2 生成证书签名请求 (CSR)‌


bash

openssl req -sha512 -new \

 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=reg.harbor.local" \

 -key reg.harbor.local.key \

 -out reg.harbor.local.csr



3.3 创建 v3.ext 配置文件‌

创建一个名为 v3.ext 的文件,用于指定 SAN 信息。请将 DNS.1 替换为你的域名,IP.1 替换为你的服务器 IP(如果需要通过 IP 访问)。


ini

authorityKeyIdentifier=keyid,issuer

basicConstraints=CA:FALSE

keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment

extendedKeyUsage = serverAuth

subjectAltName = @alt_names


[alt_names]

DNS.1=reg.harbor.local

# 如果需要通过IP访问,取消下面注释并修改IP

# IP.1=192.168.9.200



3.4 生成服务器证书‌

使用 CA 证书和私钥对 CSR 进行签名,生成最终的服务器证书:


bash

openssl x509 -req -sha512 -days 3650 \

 -extfile v3.ext \

 -CA ca.crt -CAkey ca.key -CAcreateserial \

 -in reg.harbor.local.csr \

 -out reg.harbor.local.crt


4. 配置 Harbor


4.1 整理证书文件‌

Harbor 配置文件通常指向特定的证书路径。将生成的服务器证书和私钥复制到 Harbor 配置的证书目录(例如 /data/cert,需提前创建):


bash

mkdir -p /data/cert

cp reg.harbor.local.crt /data/cert/

cp reg.harbor.local.key /data/cert/



4.2 修改 harbor.yml 配置文件‌

进入 Harbor 安装目录,编辑 harbor.yml 文件。找到 https 部分,确保证书路径正确,并启用 HTTPS:


yaml

https:

  # https port for harbor, default is 443

  port: 443

  # The path of cert and key files for nginx

  certificate: /data/cert/reg.harbor.local.crt

  private_key: /data/cert/reg.harbor.local.key



注意:如果之前配置了 HTTP,请注释掉 http 相关配置或确保端口不冲突。


4.3 重新部署 Harbor‌

停止当前运行的 Harbor 实例,重新生成配置并启动:


bash

docker-compose down -v

./prepare

docker-compose up -d


5. 客户端配置信任证书


为了让 Docker 客户端能够信任自建的 CA 证书,需要在每台需要推送或拉取镜像的机器上配置证书。


5.1 创建证书目录‌

Docker 守护进程会在 /etc/docker/certs.d/<registry-domain>/ 目录下查找证书。


bash

mkdir -p /etc/docker/certs.d/reg.harbor.local/



5.2 复制 CA 证书‌

将之前生成的 ca.crt 复制到上述目录,并重命名为 ca.crt(某些版本可能需要命名为 domain.crt,但标准做法是 ca.crt 或直接作为受信任根证书导入系统)。


bash

cp ca.crt /etc/docker/certs.d/reg.harbor.local/ca.crt



可选步骤:如果操作系统层面也需要信任该 CA(如使用 curl 或其他工具),可以将 ca.crt 添加到系统的受信任证书存储中(例如在 CentOS/RHEL 上使用 update-ca-trust,在 Ubuntu 上使用 update-ca-certificates)。


5.3 重启 Docker 服务‌


bash

systemctl restart docker


6. 验证测试


在客户端机器上尝试登录 Harbor:


bash

docker login reg.harbor.local



输入 admin 用户和密码(默认密码通常在 harbor.yml 中设置,初始为 Harbor12345)。如果登录成功,说明 HTTPS 配置及证书信任已生效。


随后可以尝试推送一个测试镜像:


bash

docker tag hello-world reg.harbor.local/library/hello-world:latest

docker push reg.harbor.local/library/hello-world:latest