Harbor https 自签证书配置

假设 Harbor 部署在 ip 为 192.168.20.106 的内网机器上

Harbor 配置 https 自签证书

参考:Configure HTTPS Access to Harbor

  1. 生成证书颁发机构证书

生成 CA 证书私钥

openssl genrsa -out ca.key 4096

生成 CA 证书

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.20.106" \
 -key ca.key \
 -out ca.crt
  1. 生成服务器证书

生成私钥

openssl genrsa -out 192.168.20.106.key 4096

生成证书签名请求(CSR)

openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
    -key 192.168.20.106.key \
    -out 192.168.20.106.csr

生成一个 x509 v3 扩展文件

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
 
[alt_names]
DNS.1=yourdomain.com
DNS.2=yourdomain
DNS.3=hostname
EOF

如果是需要填写 IP则不需要填写 DNS 列表,只需要如下配置:

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:192.168.20.106
EOF

使用 v3.ext 文件为 Harbor 主机生成证书

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in 192.168.20.106.csr \
    -out 192.168.20.106.crt
  1. 192.168.20.106.crt 转换为 192.168.20.106.cert
openssl x509 -inform PEM -in 192.168.20.106.crt -out 192.168.20.106.cert
  1. 编辑 Harbor 配置文件
vi /harbor/harbor.yaml
https:
  port: 443
  certificate: /ssl-file-dir/192.168.20.106.crt
  private_key: /ssl-file-dir/192.168.20.106.key
  1. 重新配置 Harbor(不会丢失数据)
/harbor-install-dir/prepare
docker compose -down -v
docker compose up -d

为 Docker 配置内网镜像仓库

  1. 将 harbor 自签证书文件拷贝到本机中指定目录下
mkdir -p /etc/docker/certs.d/192.168.20.106
 
# 密码: harbor
scp harbor@192.168.20.106:/home/harbor/ssl/192.168.20.106.cert /etc/docker/certs.d/192.168.20.106/
scp harbor@192.168.20.106:/home/harbor/ssl/192.168.20.106.key /etc/docker/certs.d/192.168.20.106/
scp harbor@192.168.20.106:/home/harbor/ssl/ca.crt /etc/docker/certs.d/192.168.20.106/
  1. 重启 Docker
systemctl restart docker
  1. 使用内网镜像仓库 Harbor 账号登录 Docker(可以使用个人 ldap 账号登录)
docker login 192.168.20.106
  1. 拉取镜像
# 格式:docker pull <镜像仓库地址>/<项目名>/xxx:xxx
docker pull 192.168.20.106/docker.io/mongo:6
  1. 推送镜像到个人镜像仓库
docker tag xxx:xxx 192.168.20.106/<项目>/xxx:xxx
docker push 192.168.20.106/<项目>/xxx:xxx
  1. 创建一个清单列表指定多平台镜像
# arm64 机器
docker tag xxx:xxx 192.168.20.106/<项目>/xxx:xxx-arm64
docker push 192.168.20.106/<项目>/xxx:xxx-arm64
 
# amd64 机器
docker tag xxx:xxx 192.168.20.106/<项目>/xxx:xxx-amd64
docker push 192.168.20.106/<项目>/xxx:xxx-amd64
 
# 任意机器,创建一个清单列表,并将两种平台的镜像加入其中
docker manifest create 192.168.20.106/<项目>/xxx:xxx \
  -a 192.168.20.106/<项目>/xxx:xxx-arm64 \
  -a 192.168.20.106/<项目>/xxx:xxx-amd64
 
# 推送清单列表
docker manifest push 192.168.20.106/<项目>/xxx:xxx

为 k8s containerd 容器运行时配置内网镜像仓库

containerd doc | github

  1. 将 192.168.20.106 上的 harbor 自签证书文件拷贝到本机中指定目录下
mkdir -p /etc/certs/192.168.20.106
 
# 密码: harbor
scp harbor@192.168.20.106:/home/harbor/ssl/192.168.20.106.cert /etc/certs/192.168.20.106/
scp harbor@192.168.20.106:/home/harbor/ssl/192.168.20.106.key /etc/certs/192.168.20.106/
scp harbor@192.168.20.106:/home/harbor/ssl/ca.crt /etc/certs/192.168.20.106/
  1. 修改 /etc/containerd/config.toml 配置文件,设置 config_path

如果使用的 containerd 语法是版本 1,这将 "io.containerd.grpc.v1.cri"替换为 cri

vi /etc/containerd/config.toml

写入

[plugin]
  ...
  [plugin."io.containerd.grpc.v1.cri".registry]
    config_path = "/etc/containerd/certs.d"
    # 注意删除这个层级下的其他无用配置,只保留 config_path
  1. 重启 containerd
systemctl restart containerd
  1. 配置证书目录

/etc/containerd/certs.d 目录下的配置文件不需要重启 containerd,是实时生效的

mkdir -p /etc/containerd/certs.d/192.168.20.106/
vi /etc/containerd/certs.d/192.168.20.106/hosts.toml

写入如下内容

server = "https://192.168.20.106"
 
[host."https://192.168.20.106"]
  capabilities = ["pull", "resolve"]
  ca = ["/etc/certs/192.168.20.106/ca.crt"]
  client = [["/etc/certs/192.168.20.106/192.168.20.106.cert", "/etc/certs/192.168.20.106/192.168.20.106.key"]]
  1. 拉取镜像
crictl pull 192.168.20.106/docker.io/mongo:6