• 1、对 harbor开启TLS提升安全性,部署更加合规
  • 2、harbor使用机器人用户
  • 3、最新版本测试

一、配置Harbor证书

1、生成自签名ca和ca证书,subj信息看需求修改
这里的 -subj 参数设置了证书的主题信息,包括国家代码 (C),州或省份 (ST),城市 (L),组织 (O),和常用名 (CN)。有效期设置为 20 年。

# 生成 CA 私钥
openssl genrsa -out ca.key 4096

# 生成自签名 CA 证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 7300 -out ca.crt \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=peekaboo/CN=My Custom CA"

2、生成带有 SAN 的 Harbor 证书
创建一个名为 san_openssl.cnf 的文件,用于定义证书请求(CSR)的配置,包括 SAN 信息:

[ req ]
default_bits        = 4096
prompt              = no
default_md          = sha256
req_extensions      = req_ext
distinguished_name  = dn

[ dn ]
C                   = CN
ST                  = Beijing
L                   = Beijing
O                   = peekaboo
OU                  = peekaboo
CN                  = harbor.baga.live

[ req_ext ]
subjectAltName      = @alt_names

[ alt_names ]
DNS.1               = harbor.baga.live
DNS.2               = baga.live

生成harbor私钥和CSR

openssl req -new -nodes -out harbor.baga.live.csr -keyout harbor.baga.live.key -config san_openssl.cnf

3、使用 CA 签署 Harbor 的证书

openssl x509 -req -in harbor.baga.live.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.baga.live.crt -days 7300 -sha256 -extfile san_openssl.cnf -extensions req_ext

二、部署harbor

1、下载harbor包,我选择最新版本
https://github.com/goharbor/harbor/releases
我使用了online包,部署时从公网拉取镜像,这需要国外网络或者代理
harbor-online-installer-v2.10.3.tgz

2、解压harbor包后创建证书目录,将生成的证书拷贝到目录certs目录中
解压后会生成harbor目录

mdkir /data/harbor/certs/
# 拷贝证书到certs目录下,证书文件如下
ca.crt  ca.key  harbor.baga.live.crt  harbor.baga.live.csr  harbor.baga.live.key  harbor-cert.tar.gz  san_openssl.cnf

3、配置harbor.yml

# 修改项,主要就是配置证书,数据目录按需修改
hostname: harbor.baga.live
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /data/harbor/certs/harbor.baga.live.crt
  private_key: /data/harbor/certs/harbor.baga.live.key
data_volume: /data

4、运行install.sh生成docker-compose

bash install.sh

# compose文件已经被更新
root@harbor:/data/harbor# ll -rth docker-compose.yml 
-rw-r--r-- 1 root root 5.8K Aug 13 10:55 docker-compose.yml

5、此时可以使用ip访问到harbor
image

6、harbor创建机器人用户
这里我创建了baga用户,但是机器人用户名是robot$baga

三、拉取镜像节点配置Docker证书

1、打包证书放到拉取镜像的docker

root@harbor:/data/harbor/certs# tar zcvf harbor-cert.tar.gz ./ca.crt ./harbor.baga.live.crt ./harbor.baga.live.key
./ca.crt
./harbor.baga.live.crt
./harbor.baga.live.key

2、jenkins的docker创建certs.d/harbor.baga.live目录,解压到目录下,这样就不需要daemon.json中指定证书文件了

root@jenkins:/etc/docker/certs.d/harbor.baga.live# scp 192.168.31.40:/data/harbor/certs/harbor-cert.tar.gz .

9、certs.d目录创建login文件

root@jenkins:/etc/docker/certs.d# cat login 
docker login harbor.baga.live -u 'robot$baga' -p 'tKHmmQvhF8e1l8Vut5WXlIB4CwudyBK1'

四、节点测试harbor

1、测试登录
这里客户端会使用cert证书去验证,服务端还是crt,可以直接mv改名,cert和crt证书是一回事

root@jenkins:/etc/docker/certs.d# bash login 
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: missing client certificate harbor.baga.live.cert for key harbor.baga.live.key
root@jenkins:/etc/docker/certs.d# mv harbor.baga.live/harbor.baga.live.crt  harbor.baga.live/harbor.baga.live.cert

root@jenkins:/etc/docker/certs.d# bash login 
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

2、打tag并推送镜像

root@jenkins:/etc/docker/certs.d# docker tag go-1:20240811-2018 harbor.baga.live/base/go-1:20240811-2018
root@jenkins:/etc/docker/certs.d# docker push harbor.baga.live/base/go-1:20240811-2018
The push refers to repository [harbor.baga.live/base/go-1]
2538d6aeab87: Layer already exists 
6a0010e8b50b: Layer already exists 
78561cef0761: Layer already exists 
20240811-2018: digest: sha256:5ac3bb771a5bc7f2f922d9da1437a510fea53ae233b850782afa66b956ec6f59 size: 945

3、我的daemon.json只配置了docker数据目录,没有指定证书,也没有信任baga仓库

root@jenkins:/etc/docker# cat daemon.json
{
  "data-root": "/data/docker"
}

测试完成