天天看點

Harbor 入門指南

Harbor 介紹

Harbor 是由 VMware 開源的一款雲原生制品倉庫,Harbor 的核心功能是存儲和管理 Artifact。Harbor 允許使用者用指令行工具對容器鏡像及其他 Artifact 進行推送和拉取,并提供了圖形管理界面幫助使用者檢視和管理這些 Artifact。在 Harbor 2.0 版本中,除容器鏡像外,Harbor 對符合 OCI 規範的 Helm Chart、CNAB、OPA Bundle 等都提供了更多的支援。

Harbor 整體架構
Harbor 入門指南
如上圖所示是 Harbor 2.0 的架構圖,從上到下可分為代理層、功能層和資料層。

  • 代理層:代理層實質上是一個 Nginx 反向代理,負責接收不同類型的用戶端請求,包括浏覽器、使用者腳本、Docker 等,并根據請求類型和 URI 轉發給不同的後端服務進行處理。
  • 功能層:
    • Portal:是一個基于 Argular 的前端應用,提供 Harbor 使用者通路的界面。
    • Core:是 Harbor 中的核心元件,封裝了 Harbor 絕大部分的業務邏輯。
    • JobService:異步任務元件,負責 Harbor 中很多比較耗時的功能,比如 Artifact 複制、掃描、垃圾回收等。
    • Docker Distribution:Harbor 通過 Distribution 實作 Artifact 的讀寫和存取等功能。
    • RegistryCtl:Docker Distribution 的控制元件。
    • Notary(可選):基于 TUF 提供鏡像簽名管理的功能。
    • 掃描工具(可選):鏡像的漏洞檢測工具。
    • ChartMuseum(可選):提供 API 管理非 OCI 規範的 Helm Chart,随着相容 OCI 規範的 Helm Chart 在社群上被更廣泛地接受,Helm Chart 能以 Artifact 的形式在 Harbor 中存儲和管理,不再依賴 ChartMuseum,是以 Harbor 可能會在後續版本中移除對 ChartMuseum 的支援。
  • 資料層:
    • Redis:主要作為緩存服務存儲一些生命周期較短的資料,同時對于 JobService 還提供了類似隊列的功能。
    • PostgreSQL:存儲 Harbor 的應用資料,比如項目資訊、使用者與項目的關系、管理政策、配置資訊、Artifact 的中繼資料等等。
    • Artifact 存儲:存儲 Artifact 本身的内容,也就是每次推送鏡像、Helm Chart 或其他 Artifact 時,資料最終存儲的地方。預設情況下,Harbor 會把 Artifact 寫入本地檔案系統中。使用者也可以修改配置,将 Artifact 存儲在外部存儲中,例如亞馬遜的對象存儲 S3、谷歌雲存儲 GCS、阿裡雲的對象存儲 OSS 等等。

Docker Compose 部署 Harbor

前提要求

硬體要求:

Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
./install.sh      

檢視 Harbor 元件運作狀況:

> docker-compose ps 
      Name                     Command                  State                        Ports                  
------------------------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up (healthy)                                           
harbor-db           /docker-entrypoint.sh 96 13      Up (healthy)                                           
harbor-jobservice   /harbor/entrypoint.sh            Up (healthy)                                           
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp               
harbor-portal       nginx -g daemon off;             Up (healthy)                                           
nginx               nginx -g daemon off;             Up (healthy)   0.0.0.0:8888->8080/tcp,:::8888->8080/tcp
redis               redis-server /etc/redis.conf     Up (healthy)                                           
registry            /home/harbor/entrypoint.sh       Up (healthy)                                           
registryctl         /home/harbor/start.sh            Up (healthy)      

登入頁面

浏覽器輸入

http://11.8.36.21:8888

通路 Harbor 頁面,使用者名和密碼為 harbor.yml 配置檔案中預設設定的 admin,Harbor12345。

Harbor 入門指南

推送鏡像

從公網拉取一個 nginx:1.19 版本的鏡像:

> docker pull nginx:1.19
1.19: Pulling from library/nginx
69692152171a: Already exists 
49f7d34d62c1: Pull complete 
5f97dc5d71ab: Pull complete 
cfcd0711b93a: Pull complete 
be6172d7651b: Pull complete 
de9813870342: Pull complete 
Digest: sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2
Status: Downloaded newer image for nginx:1.19      

編輯 /etc/docker/daemon.json,設定允許通路的 HTTP 倉庫位址。

{
  "insecure-registries":["11.8.36.21:8888"]
}      

修改鏡像 tag:

docker tag nginx:1.19 11.8.36.21:8888/library/nginx:1.19      

登入 Harbor:

> docker login 11.8.36.21:8888
Username: admin
Password: 
Login Succeeded      

推送鏡像到 Harbor:

> docker push 11.8.36.21:8888/library/nginx:1.19
The push refers to a repository [11.8.36.21:8888/library/nginx]
f0f30197ccf9: Pushed 
eeb14ff930d4: Pushed 
c9732df61184: Pushed 
4b8db2d7f35a: Pushed 
431f409d4c5a: Pushed 
02c055ef67f5: Pushed 
1.19: digest: sha256:eba373a0620f68ffdc3f217041ad25ef084475b8feb35b992574cd83698e9e3c size: 1570      

檢視推送的鏡像:

Harbor 入門指南

HTTPS 配置(可選)

在生産環境中建議配置 HTTPS,可以使用由受信任的第三方 CA 簽名的證書,也可以使用自簽名證書。如果想要啟用 Content Trust with Notary 來正确簽名所有圖像,則必須使用 HTTPS。

建立目錄

首先建立目錄存放生成的證書。

mkdir /root/cert
cd /root/cert/      

生成 CA 證書

本次實驗中我們使用自簽名證書。生産環境中應使用受信任的第三方 CA 簽名的證書。

生成 CA 證書私鑰
openssl genrsa -out ca.key 4096      

-subj 表示證書的組織。CN 後面的值改成 harbor 的 IP 位址或者域名。

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=11.8.36.21" \
 -key ca.key \
 -out ca.crt      

生成 Server 證書

生成 Harbor 使用的證書和私鑰。

生成 Server 私鑰
openssl genrsa -out server.key 4096      
生成 Server 證書簽名請求(CSR)

生成 Harbor 的證書簽名請求,使用上面生成的 CA 證書來給 Server 簽發證書。

openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=11.8.36.21" \
    -key server.key \
    -out server.csr      
生成 x509 v3 擴充檔案

通過 docker 或者 ctr 等工具拉取 HTTPS 的鏡像時,要求 HTTPS 的證書包含 SAN 擴充。

SAN(Subject Alternative Name) 是 SSL 标準 x509 中定義的一個擴充。使用了 SAN 字段的 SSL 證書,可以擴充此證書支援的域名,使得一個證書可以支援多個不同域名的解析。例如下圖中 Google 的這張證書的主題備用名稱(SAN)中列了一大串的域名,是以這張證書能夠被多個域名所使用。對于 Google 這種域名數量較多的公司來說,使用這種類型的證書能夠極大的簡化網站證書的管理。

Harbor 入門指南

使用以下指令生成 x509 v3 擴充檔案:

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

如果是域名通路通過下面方式生成 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.harbor.com
EO      
使用 CA 證書簽發 Server 證書
openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in server.csr \
    -out server.crt      

檢視目前目錄生成的檔案:

root@ydt-net-portainer:/root/cert #ll 
total 32
-rw-r--r-- 1 root root 2025 Aug  6 20:44 ca.crt 
-rw-r--r-- 1 root root 3243 Aug  6 20:40 ca.key  
-rw-r--r-- 1 root root   17 Aug  6 21:03 ca.srl
-rw-r--r-- 1 root root 2045 Aug  6 21:03 server.crt
-rw-r--r-- 1 root root 1704 Aug  6 20:47 server.csr
-rw-r--r-- 1 root root 3247 Aug  6 20:45 server.key
-rw-r--r-- 1 root root  202 Aug  6 21:00 v3.ext      

為 Harbor 和 Docker 配置證書

将 server 證書和密鑰複制到 Harbor 主機上的 /data/cert 目錄中
mkdir -p /data/cert
cp server.crt /data/cert/
cp server.key /data/cert/      
轉換 server.crt 為 server.cert

Docker 守護程式會認為 .crt 檔案是 CA 證書,是以需要将 server 證書轉換為 server.cert 檔案。其實改下字尾就可以了,證書裡面的内容是一樣的。

openssl x509 -inform PEM -in server.crt -out server.cert      
将 server 證書,密鑰和 CA 證書複制到 Harbor 主機上的 Docker 證書目錄中

需要提前建立好 Docker 證書目錄,如果使用 443 端口監聽 HTTPS 請求,則目錄為 IP/域名 即可,如果使用非 443 端口,則目錄為 IP/域名:端口。

mkdir -p /etc/docker/certs.d/11.8.36.21:8443
cp server.cert /etc/docker/certs.d/11.8.36.21:8443
cp server.key /etc/docker/certs.d/11.8.36.21:8443
cp ca.crt /etc/docker/certs.d/11.8.36.21:8443      

檢視 Docker 證書目錄檔案:

root@ydt-net-portainer:/root/cert #ll /etc/docker/certs.d/11.8.36.21:8443/
total 12
-rw-r--r-- 1 root root 2025 Aug  6 21:15 ca.crt
-rw-r--r-- 1 root root 2045 Aug  6 21:15 server.cert
-rw-r--r-- 1 root root 3247 Aug  6 21:15 server.key      
重新開機 Docker Engine
systemctl restart docker      

重新部署 Harbor

修改 harbor.yml 配置檔案,添加 HTTPS 相關配置,指定 HTTPS 的端口号和證書路徑:

Harbor 入門指南

使用 prepare 腳本生成 HTTPS 配置

使用 prepare 腳本為反向代理 Nginx 容器生成 HTTPS 配置。

./prepare      

删除原有 Harbor 容器

Harbor 原有的資料檔案預設是挂載在主控端的 /data 目錄下,是以删除 Harbor 容器并不會丢失資料。

docker-compose down -v      

重新啟動 Harbor

docker-compose up -d      

登入 HTTPS 頁面
Harbor 入門指南
Docker 拉取和推送鏡像

Docker 想要拉取或者推送 HTTPS 鏡像倉庫的鏡像,需要在 Docker 證書目錄中配置證書,這裡的 Docker 用戶端是另一台機器,首先在這台機器上建立目錄。

mkdir /etc/docker/certs.d/11.8.36.21:8443      

然後從 Harbor 主機拷貝證書檔案到 Docker 用戶端上,需要 server 的證書和密鑰以及 CA 證書。

scp /root/cert/server.key  [email protected]:/etc/docker/certs.d/11.8.36.21:8443
scp /root/cert/server.cert  [email protected]:/etc/docker/certs.d/11.8.36.21:8443
scp /root/cert/ca.crt  [email protected]:/etc/docker/certs.d/11.8.36.21:8443      

拉取鏡像:

root@ydt-net-nginx-cisp:/root #docker pull 11.8.36.21:8443/library/nginx:1.19
Trying to pull repository 11.8.36.21:8443/library/nginx ... 
1.19: Pulling from 11.8.36.21:8443/library/nginx
Digest: sha256:eba373a0620f68ffdc3f217041ad25ef084475b8feb35b992574cd83698e9e3c
Status: Downloaded newer image for 11.8.36.21:8443/library/nginx:1.19      

推送鏡像:

#登入 Harbor 鏡像倉庫
root@ydt-net-nginx-cisp:/root #docker login https://11.8.36.21:8443
Username: admin
Password: 
Login Succeeded
#給鏡像打 tag,換個名字
root@ydt-net-nginx-cisp:/root #docker tag 11.8.36.21:8443/library/nginx:1.19 11.8.36.21:8443/library/nginx-2:1.19
#推送鏡像
root@ydt-net-nginx-cisp:/root #docker push 11.8.36.21:8443/library/nginx-2:1.19
The push refers to a repository [11.8.36.21:8443/library/nginx-2]
f0f30197ccf9: Pushed 
eeb14ff930d4: Pushed 
c9732df61184: Pushed 
4b8db2d7f35a: Pushed 
431f409d4c5a: Pushed 
02c055ef67f5: Pushed 
1.19: digest: sha256:eba373a0620f68ffdc3f217041ad25ef084475b8feb35b992574cd83698e9e3c size: 1570      

Containerd 配置鏡像倉庫

Kubernetes 最早将在 1.23 版本棄用 Docker 作為容器運作時,并在部落格中強調可以使用如 Containerd 等 CRI 運作時來代替 Docker。

Harbor 入門指南

對于 Containerd 來說,不能像 Docker 一樣使用 docker login 登入到鏡像倉庫,需要修改其配置檔案來進行認證。

方式一 跳過證書驗證

編輯 /etc/containerd/config.toml 檔案,添加以下配置。注意這裡有個天坑:registry.mirrors 後面跟的才是 Harbor 主機的位址,一定要寫對,反倒是 endpoint 中的内容可以随便寫。

[plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
         [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
            endpoint = ["https://registry-1.docker.io"]
         [plugins."io.containerd.grpc.v1.cri".registry.mirrors."11.8.75.154:11111"] #一定要寫對
             endpoint = ["https://11.8.75.154:11111"] #其實可以随便寫
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
         [plugins."io.containerd.grpc.v1.cri".registry.configs."11.8.75.154:11111".tls]
             insecure_skip_verify = true #跳過證書驗證
         [plugins."io.containerd.grpc.v1.cri".registry.configs."11.8.75.154:11111".auth]
             username = "admin"
             password = "Harbor12345"      
方式二 配置證書

如果想要安全些,可以把 CA 證書拷貝到 containerd 的機器上,然後修改 /etc/containerd/config.toml,指定 CA 證書。

[plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
         [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
            endpoint = ["https://registry-1.docker.io"]
         [plugins."io.containerd.grpc.v1.cri".registry.mirrors."11.8.75.154:11111"]
             endpoint = ["https://11.8.75.154:11111"]
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
         [plugins."io.containerd.grpc.v1.cri".registry.configs."11.8.75.154:11111".tls]
             ca_file = "/etc/ssl/certs/ca.crt" #指定CA憑證
         [plugins."io.containerd.grpc.v1.cri".registry.configs."11.8.75.154:11111".auth]
             username = "admin"
             password = "Harbor12345"      

配置檔案後重新開機 Containerd:

systemctl restart containerd      

當 Kubernetes 需要拉取 Harbor 的鏡像時,會自動根據 Containerd 的配置認證 Harbor 鏡像倉庫。

Kubernetes 部署 Harbor

上面介紹的通過 Docker Compose 方式部署 Harbor 的方式通常僅在單機測試環境下使用,在生産環境中使用者可能需要在 Kubernetes 叢集中部署 Harbor。Harbor 提供了 Helm Chart 來幫助使用者在 Kubernetes 上快速部署 Harbor。

添加 Harbor Helm Chart 倉庫,并将 Helm Chart 下載下傳到本地。

helm repo add harbor https://helm.goharbor.io
helm pull  harbor/harbor --untar      

編輯 harbar/values.yaml 檔案:

  • 修改服務類型為 nodePort,這樣 Kubernetes 叢集外部的機器就可以通過 Node:IP 來通路 Harbor。
  • 設定 HTTPS 證書的域名。
    Harbor 入門指南
    Harbor 入門指南
helm install harbor -n cloudnative-lab harbor --create-namespace      

檢視部署的 Harbor 容器。

❯ kubectl get pod -n cloudnative-lab | grep harbor
harbor-chartmuseum-685fccc58d-n6bs7              1/1     Running   0          5m46s
harbor-core-58db6ff9b9-zfk2z                     1/1     Running   1          5m46s
harbor-database-0                                1/1     Running   0          5m46s
harbor-jobservice-6867cc6bfb-cpvrq               1/1     Running   0          5m46s
harbor-nginx-7949594686-f4cxz                    1/1     Running   0          5m46s
harbor-notary-server-6845f46559-975g4            1/1     Running   2          5m46s
harbor-notary-signer-6bcf747cc7-9k62c            1/1     Running   2          5m46s
harbor-portal-c55c48545-twnfn                    1/1     Running   0          5m46s
harbor-redis-0                                   1/1     Running   0          5m46s
harbor-registry-7df77757c4-k4kqz                 2/2     Running   0          5m46s
harbor-trivy-0                                   1/1     Running   1          5m46s      

檢視 Harbor 相關的 service,注意名為 harbor 的 service,這是 Harbor 反向代理 Nginx 的容器對應的 service,通過 NodePort 的方式暴露到叢集外,下面在 Kubernetes 叢集外我們都是通過這個 service 來通路 Harbor。

❯ kubectl get svc -n cloudnative-lab | grep harbor
harbor                          NodePort    24.3.218.77    <none>        80:30002/TCP,443:30003/TCP,4443:30004/TCP   6m7s
harbor-chartmuseum              ClusterIP   24.3.89.193    <none>        80/TCP                                      6m8s
harbor-core                     ClusterIP   24.3.166.42    <none>        80/TCP                                      6m8s
harbor-database                 ClusterIP   24.3.68.131    <none>        5432/TCP                                    6m8s
harbor-jobservice               ClusterIP   24.3.96.160    <none>        80/TCP                                      6m8s
harbor-notary-server            ClusterIP   24.3.15.36     <none>        4443/TCP                                    6m7s
harbor-notary-signer            ClusterIP   24.3.150.117   <none>        7899/TCP                                    6m7s
harbor-portal                   ClusterIP   24.3.183.66    <none>        80/TCP                                      6m7s
harbor-redis                    ClusterIP   24.3.254.28    <none>        6379/TCP                                    6m7s
harbor-registry                 ClusterIP   24.3.167.212   <none>        5000/TCP,8080/TCP                           6m7s
harbor-trivy                    ClusterIP   24.3.110.121   <none>        8080/TCP                                    6m7s      

用戶端添加 hosts 記錄,編輯 /etc/hosts 添加,11.8.38.43 是其中一個 Kubernetes 節點的 IP 位址,myharbor.com 是我們前面部署 Harbor 時指定的域名。

11.8.38.43   myharbor.com      

通過 Kubernetes 部署 Harbor 預設會生成自簽名證書并啟動 HTTPS 加密。浏覽器輸入

https://myharbor.com:30003

通路 Harbor 使用者界面。

Harbor 入門指南

使用 Harbor 作為 Helm Chart 制品倉庫

Harbor 不僅可以作為鏡像倉庫,還可以管理符合 OCI 規範的 Helm Chart、CNAB、OPA Bundle 等 Artifact。

WebUI 上傳 Helm Charts

首先建立一個項目名為 helm-repo。

Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南

在大規模叢集環境下,如果所有 Docker 主機都從一個鏡像倉庫中拉取鏡像,那麼此鏡像倉庫很可能會成為鏡像分發的瓶頸,影響鏡像分發的速度。可以通過搭建多個鏡像倉庫并配合使用遠端複制功能,解決這一問題。如下圖所示,圖中的鏡像倉庫分為兩級:主倉庫和子倉庫。在主倉庫和子倉庫之間配置了遠端複制政策。當一個應用鏡像被推送到主倉庫後,根據所配置的複制政策,鏡像可以立即被分發到其他子鏡像倉庫。叢集中的 Docker 主機就可以就近在其中任意一個子倉庫中拉取所需的鏡像,減輕主倉庫的壓力。

首先建立一個目标倉庫,這裡的目标倉庫選擇前面用 Docker Compose 部署的 Harbor。

Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南

鏡像掃描

代碼和軟體通常具有缺陷,作為應用和其所依賴的軟體包和作業系統的打包形式,容器鏡像自然也不例外。惡意的攻擊者會利用其中的一些缺陷非法入侵系統,破壞系統的運作或者竊取私密資訊,這些缺陷就是我們熟知的漏洞。缺陷一旦被認定為漏洞,就可以通過 MITRE 公司注冊為 CVE(Common Vulnerabilities and Exposures,公開披露的計算機安全漏洞清單)。

Harbor 支援 Trivy 和 Clair 作為鏡像掃描器,通過 Helm 方式部署的 Harbor 預設安裝了 Trivy。

可以在項目中選擇指定的 Artifact 進行掃描,也可以在審查服務中進行全局漏洞掃描。

全局漏洞掃描:

Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南

鏡像簽名

TUF 是一種安全軟體分發規範,具有由非對稱密鑰表示的具有層次結構的角色,并且運用這些非對稱密鑰簽名的中繼資料來建立信任。開源項目 Notary 基于 TUF 實作,提供了完整的工具鍊來更好地支援内容信任流程。

通過 Helm 方式部署 Harbor 預設安裝了 Notary。在 Harbor 核心服務中實作了簽名管理器,可通過 Notary 伺服器實作 Artifact 數字簽名的管理。内容信任確定用戶端或者容器運作時拉取的 Artifact 内容真實可靠,進而更好地提高系統的安全性。

建立一個項目 sign 存放該實驗的鏡像。

Harbor 入門指南
Harbor 入門指南
#30004 是 Notary 服務對外暴露的端口
~/.docker/tls/myharbor.com:30004
#30003 是 Portal 服務對外暴露的端口
/etc/docker/certs.d/myharbor.com:30003      

在本地給鏡像打 tag 并推送鏡像到 Harbor。在上傳成功後會繼續内容信任的簽名步驟。如果根密鑰還未建立,則系統會要求輸入強密碼以建立根密鑰,之後在啟用内容信任的條件下推送鏡像都需要該密碼。同時,系統還會要求輸入強密碼以建立正在推送的鏡像倉庫的目标密鑰。

> docker tag 11.8.36.21:8443/library/nginx:1.19 myharbor.com:30003/sign/nginx-sign:1.19
> docker push myharbor.com:30003/sign/nginx-sign:1.19
The push refers to a repository [myharbor.com:30003/sign/nginx-sign]
f0f30197ccf9: Layer already exists 
eeb14ff930d4: Layer already exists 
c9732df61184: Layer already exists 
4b8db2d7f35a: Layer already exists 
431f409d4c5a: Layer already exists 
02c055ef67f5: Layer already exists 
1.19: digest: sha256:eba373a0620f68ffdc3f217041ad25ef084475b8feb35b992574cd83698e9e3c size: 1570
Signing and pushing trust metadata
#建立根密鑰
You are about to create a new root signing key passphrase. This passphrase
will be used to protect the most sensitive key in your signing system. Please
choose a long, complex passphrase and be careful to keep the password and the
key file itself secure and backed up. It is highly recommended that you use a
password manager to generate the passphrase and keep it safe. There will be no
way to recover this key. You can find the key in your config directory.
Enter passphrase for new root key with ID 00eeb53: 
Repeat passphrase for new root key with ID 00eeb53: 
#建立正在推送的鏡像倉庫的目标密鑰
Enter passphrase for new repository key with ID 45f6c55 (myharbor.com:30003/sign/nginx-sign): 
Repeat passphrase for new repository key with ID 45f6c55 (myharbor.com:30003/sign/nginx-sign): 
Finished initializing "myharbor.com:30003/sign/nginx-sign"
Successfully signed "myharbor.com:30003/sign/nginx-sign":1.19      

生成的密鑰都會以

~/.docker/trust/private/.key

路徑存放,對應的 TUF 中繼資料檔案被存放在

~/.docker/trust/tuf//<鏡像倉庫路徑>/metadata

目錄下。

#tree ~/.docker/trust/
/root/.docker/trust/
├── private
│   ├── root_keys
│   │   └── 00eeb53b454983f95c12718d1dcfdbc1e600253c20eab1ca8ee5743dac9f0fa0.key
│   └── tuf_keys
│       └── myharbor.com:30003
│           └── sign
│               └── nginx-sign
│                   └── 45f6c55ea9846cf0ba552915e0599b4e7f45c742f6418c5f1116b61f2650ca48.key
└── tuf
    └── myharbor.com:30003
        └── sign
            └── nginx-sign
                ├── changelist
                └── metadata
                    ├── root.json      

簽名成功後,登入 Harbor 管理界面,可以在鏡像的 tag 清單中檢視該鏡像處于已簽名的狀态。

Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南
Harbor 入門指南

于是想到有可能是時間的問題,可能是 Docker 用戶端的時間比證書生效的時間還早。檢視了系統時間果然發現時間比标準時間慢了 6 分鐘。設定 NTP 同步時間以後就可以正常登入了。

#date 
Mon Aug  9 20:54:43 CST 2021
root@ydt-net-nginx-cisp:/etc/docker/certs.d/myharbor.com:30003 #
#ntpdate ntp3.aliyun.com
 9 Aug 21:00:47 ntpdate[96996]: step time server 203.107.6.88 offset 355.206298 sec
root@ydt-net-nginx-cisp:/etc/docker/certs.d/
#date 
Mon Aug  9 21:00:51 CST 2021
#docker login https://myharbor.com:30003
Username: admin
Password: 
Login Succeeded      

參考資料

繼續閱讀