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

 

 
posted @ 2023-02-25 23:42  しみずよしだ  阅读(183)  评论(0)    收藏  举报