Harbor 基于SAN自签证书部署 + 镜像同步
参考作者:https://blog.csdn.net/weixin_46476452/article/details/127732870
harbor使用自签名证书部署 :为什么要用san模式签发呢? 因为 新版的containerd 使用go写的 harbor使用containerd就需要san模式签发的证书。
安装harbor
1.安装docker
2.配置docker-compose
3.下载安装包
-rw-r--r--. 1 root root 76724391 Feb 25 13:03 docker-20.10.17-binary-install.tar.gz
-rw-r--r--. 1 root root 25907200 Feb 25 13:04 docker-compose-linux-x86_64
-rw-r--r--. 1 root root 605477475 Feb 25 13:04 harbor-offline-installer-v2.3.2.tgz
实验环境:
1台CentOS7.6.1810
harbor.magedu.net
Docker:20.10.17
docker-compose version 1.28.6, build 5db8d86f
harbor:v2.3.2
Docker安装部署
下载&安装docker-compose
[root@harbor2 harbor]# chmod a+x docker-compose-linux-x86_64 && mv docker-compose-linux-x86_64 /usr/bin/docker-compose mv: overwrite ‘/usr/bin/docker-compose’? y [root@harbor2 harbor]# docker --version Docker version 20.10.17, build 100c701
下载安装harbor离线包
tar xvf harbor-offline-installer-v2.3.2.tgz
cd harbor cp harbor.yml.tmpl harbor.yml
修改配置文件
修改如下五项参数
hostname: harbor的名称可以使用IP或域名,推荐域名可以实现https
certificate: 添加公钥,需要按照官方方式进行签发证书
private_key: 添加私钥
data_volume: 定义存储路径(建议一个单独分区作为存储路径)
harbor_admin_password: 修改harbor登录密码 可以不用改 改了可能会修改数据库密码

参考官方文档:
https://goharbor.io/docs/2.4.0/install-config/configure-https/
默认情况下,Harbor不附带证书。可以在没有安全性的情况下部署Harbor,这样您就可以通过HTTP连接到它。然而,只有在没有连接到外部互联网的测试或开发环境中,使用HTTP才是可接受的。在没有空隙的环境中使用HTTP会使您面临中间人攻击。在生产环境中,请始终使用HTTPS。如果您启用公证内容信任来正确签署所有图像,您必须使用HTTPS
要配置HTTPS,您必须创建SSL证书。您可以使用由受信任的第三方CA签名的证书,也可以使用自签名证书。本节描述如何使用OpenSSL创建CA,以及如何使用CA签署服务器证书和客户端证书。您可以使用其他CA提供商,例如Let's Encrypt
生成证书颁发机构证书
在生产环境中,您应该从CA获得证书。在测试或开发环境中,您可以生成自己的CA。要生成CA证书,请运行以下命令。
1.生成CA证书私钥
openssl genrsa -out ca.key 4096
touch /root/.rnd #记录签发信息 提前进行创建
2.生成CA证书
openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \ -key ca.key \ -out ca.crt
openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=magedu.com" \ -key ca.key \ -out ca.crt
生成服务器证书
证书通常包含一个. crt文件和一个. key文件,例如yourdomain.com.crt和yourdomain.com.key
1.生成私钥
openssl genrsa -out yourdomain.com.key 4096
openssl genrsa -out magedu.net.key 4096
2.生成证书签名请求(CSR)
修改-subj选项中的值以反映您的组织。如果您使用FQDN连接您的Harbor主机,您必须将其指定为通用名称(CN)属性,并在密钥和CSR文件名中使用它
openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \ -key yourdomain.com.key \ -out yourdomain.com.csr
openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=magedu.net" \ -key magedu.net.key \ -out magedu.net.csr
3.生成x509 v3扩展文件
无论您是使用FQDN还是IP地址连接到您的Harbor主机,您都必须创建此文件,以便您可以为您的Harbor主机生成符合主题备用名称(SAN)和x509 v3扩展要求的证书。替换DNS条目以反映您的域
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
cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=magedu.com DNS.2=harbor.magedu.net DNS.3=harbor.magedu.local
DNS.4=harborsync.magedu.net
EOF
4.使用v3.ext文件为您的Harbor主机生成证书。 用harbor主机名替换CRS和CRT文件名中的yourdomain.com
openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in yourdomain.com.csr \ -out yourdomain.com.cr
openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in magedu.net.csr \ -out magedu.net.crt


-CA ca.crt -CAkey ca.key表示CA直接签发,指定magedu.net.csr这个文件,
签发完后是magedu.net.crt文件;并会加载v3.ext这个文件,v3.ext文件的
信息会被签发到magedu.net.crt文件信息证书里
我们harbor用的就是这个magedu.net.crt和magedu.net.key文件
将crt文件转换为cert客户端证书文件
[root@harbornew certs]# openssl x509 -inform PEM -in magedu.net.crt -out magedu.net.cert
温馨提示:
docker程序认为"*.crt"文件是CA证书文件,"*.cert"客户端证书文件,于是上面第五步需要转换一下,其实使用cp一下也是可以的,内容并没有变化。
证书整理
[root@harbornew certs]# ll
total 32
drwxr-xr-x 5 root root 44 Jul 12 14:59 all
-rw-r--r-- 1 root root 2025 Jul 12 14:33 ca.crt
-rw-r--r-- 1 root root 3243 Jul 12 14:33 ca.key
-rw-r--r-- 1 root root 17 Jul 12 14:34 ca.srl
-rw-r--r-- 1 root root 2143 Jul 12 14:55 magedu.net.cert
-rw-r--r-- 1 root root 2143 Jul 12 14:34 magedu.net.crt
-rw-r--r-- 1 root root 1704 Jul 12 14:34 magedu.net.csr
-rw-r--r-- 1 root root 3247 Jul 12 14:33 magedu.net.key
-rw-r--r-- 1 root root 307 Jul 12 14:34 v3.ext
[root@harbornew certs]# ll all/
total 0
drwxr-xr-x 2 root root 48 Jul 12 14:58 CA
drwxr-xr-x 2 root root 65 Jul 12 14:59 Client
drwxr-xr-x 2 root root 95 Jul 12 14:59 Server
[root@harbornew certs]# ll all/CA/
total 12
-rw-r--r-- 1 root root 2025 Jul 12 14:58 ca.crt
-rw-r--r-- 1 root root 3243 Jul 12 14:58 ca.key
-rw-r--r-- 1 root root 17 Jul 12 14:58 ca.srl
[root@harbornew certs]# ll all/Client/
total 12
-rw-r--r-- 1 root root 2025 Jul 12 14:59 ca.crt
-rw-r--r-- 1 root root 2143 Jul 12 14:59 magedu.net.cert
-rw-r--r-- 1 root root 3247 Jul 12 14:59 magedu.net.key
[root@harbornew certs]# ll all/Server/
total 16
-rw-r--r-- 1 root root 2143 Jul 12 14:59 magedu.net.cert
-rw-r--r-- 1 root root 2143 Jul 12 14:59 magedu.net.crt
-rw-r--r-- 1 root root 1704 Jul 12 14:59 magedu.net.csr
-rw-r--r-- 1 root root 3247 Jul 12 14:59 magedu.net.key
配置harbor.yml HTTPS 证书
# http related config
#http:
# port for http, default is 80. If https enabled, this port will redirect to https port
#port: 80
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /root/Docker-Harbor/harbor/certs/magedu.net.crt
private_key: /root/Docker-Harbor/harbor/certs/magedu.net.key
运行harbor
./install.sh --with-trivy --with-chartmuseum
报错了:
[Step 5]: starting Harbor ... [+] Running 2/0 ⠿ Network harbor_harbor Created 0.0s ⠿ Network harbor_harbor-chartmuseum Created 0.0s ⠋ Container harbor-log Creating 0.0s Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /var/log/harbor/
解决办法:mkdir /var/log/harbor
====
实验环境:
两台CentOS7.6.1810
harbor.magedu.net | harborsync.magedu.net
第二台和第一台样 配置文件修改一下域名
两台授信
harbor:创建对端证书文件夹,存放对端证书
mkdir /etc/docker/certs.d/harborsync.magedu.net -p
scp /apps/harbor/certs/magedu.net.crt harborsync:/etc/docker/certs.d/harbor.magedu.net
harborsync:创建对端证书文件夹,存放对端证书
mkdir /etc/docker/certs.d/harbor.magedu.net -p
scp /apps/harbor/certs/magedu.net.crt harbor:/etc/docker/certs.d/harborsync.magedu.net
docker添加harbor信任仓库:添加registries和加速器 两台都需要加
vi /etc/docker/daemon.json
[root@harborsync harbor]# cat /etc/docker/daemon.json { "graph": "/var/lib/docker", "storage-driver": "overlay2", "insecure-registries": ["harbor.magedu.net","harbor.myserver.com","172.31.7.105","harborsync.magedu.net"], "registry-mirrors": ["https://9916w1ow.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "live-restore": false, "log-opts": { "max-file": "5", "max-size": "100m" } }
配置hosts文件
重启docker和harbor
测试登录harbor
配置界面仓库管理报错:/var/log/harbor/core.log中显示无法找到


原因未知-可能是:
容器中无法解析域名地址,在harbor-core容器中添加 /etc/hosts 把两个域名给添加
1、禁止ping导致
2、也可能就是解析不到域名(但是我直接用了ip还是不行,也确实是修改了容器的hosts搞定的)
解决办法(1). 临时在harbor-core容器中添加 hosts文件解析。
docker exec -it -u root `docker ps |awk '/core/{print $1}'` /bin/bash
echo "192.168.40.132 harbor.magedu.net" >> /etc/hosts
echo "192.168.40.133 harborsync.magedu.net" >> /etc/hosts
或者
解决办法(2).永久修改 docker-compose.yaml文件,找一段harbor-core这段,在 volumes: 后追加一个列表项,内容
- /etc/hosts:/etc/hosts:z

将宿主机的hosts文件挂载到容器内。
然后使用docker-compose up -d 命令启动harbor服务。

接下来测试推送镜像,就可以正常同步了。



一定要改为事件驱动 否则推送无法同步


测试同步是否正常
[root@harborsync harbor]# docker pull centos:7.8.2003 7.8.2003: Pulling from library/centos 9b4ebb48de8d: Pull complete Digest: sha256:8540a199ad51c6b7b51492fa9fee27549fd11b3bb913e888ab2ccf77cbb72cc1 Status: Downloaded newer image for centos:7.8.2003 docker.io/library/centos:7.8.2003 [root@harborsync harbor]# docker login harborsync.magedu.net Authenticating with existing credentials... 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 [root@harborsync harbor]# docker tag centos:7.8.2003 harborsync.magedu.net/birkhoffxia/centos:7.8.2003 [root@harborsync harbor]# docker push harborsync.magedu.net/birkhoffxia/centos:7.8.2003 The push refers to repository [harborsync.magedu.net/birkhoffxia/centos] fb82b029bea0: Pushed 7.8.2003: digest: sha256:50b9a3bc27378889210f88d6d0695938e45a912aa99b3fdacfb9a0fef511f15a size: 529


浙公网安备 33010602011771号