Harbor使用自簽名證書配置https認證

背景

我們知道Harbor是用來存儲docker鏡像的倉庫系統。目前docker從鏡像倉庫pull或push鏡像都是採用https形式的(例如官方的Docker hub),故有必要將Harbor配置成https訪問,並使其他Docker機器能成功推送、拉取鏡像。

步驟

關於Harbor配置https的文檔官方有非常詳盡的說明。這裏主要對一些我遇到的問題做一個補充。
因我這裏配置Harbor的機器沒有申請到域名,故只能採用Harbor主機IP代替,假設IP爲:10.34.56.78。

1. 生成證書

在10.34.56.78的機器目錄下新建文件夾例如叫ca_files(絕對路徑假設爲/home/usr/ca_files),然後在該目錄下依照官方文檔步驟生成證書(下面每個命令以###隔開):

mkdir ca_files
###
cd ca_files
###
openssl genrsa -out ca.key 4096
###
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=10.34.56.78" -key ca.key -out ca.crt

上面的命令運行完後,可以看到在ca_files下生成了ca.key、ca.crt兩個文件,繼續運行如下命令來生成私鑰:

openssl genrsa -out 10.34.56.78.key 4096
###
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=10.34.56.78" -key 10.34.56.78.key -out 10.34.56.78.csr

上面命令運行完後可以看到在ca_files下繼續生成了10.34.56.78.key、10.34.56.78.csr兩個文件。
接着生成一個v3.ext文件並使用這個文件來獲取認證,命令如下:

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:10.34.56.78
EOF
### 
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in 10.34.56.78.csr -out 10.34.56.78.crt

不出意外又會在ca_files文件夾下生成一些文件.這裏要注意,上面第一個命令中的:subjectAltName = IP:10.34.56.78 這一行與官方文檔中有些不同,因爲我們這裏沒有申請域名,所以直接以IP指定。

2. 配置Harbor

假設我這裏在10.34.56.78機器上安裝Harbor的絕對路徑爲/home/usr/harbor,則在harbor目錄下找到 harbor.yml 文件(我這裏Harbor安裝的版本爲v1.10.1)進行編輯:

# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  # 注意這裏配置證書路徑
  certificate: /home/usr/ca_files/10.34.56.78.crt
  private_key: /home/usr/ca_files/10.34.56.78.key

配置完成後,若Harbor還沒有安裝,則直接在harbor目錄下運行:

sudo ./install.sh

若Harbor已安裝過,則在harbor目錄下運行如下命令:

sudo ./prepare
###
docker-compose down -v
###
docker-compose up -d

此時,若沒有報錯,則Harbor已經變成https訪問了。

3. 在其他機器上docker login Harbor

假設我有另一臺機器(IP爲:12.34.56.78),這臺機器已配置完docker環境,並且我已經做好了一個docker的image,假設image名爲:my_nginx:v1.0。
這時,爲了使該機器能“docker login 10.34.56.78”成功,我們還需要做一些配置。首先在12.34.56.78機器上創建一個文件夾(例如名爲:my_ca,絕對路徑是:/home/me/my_ca),然後將10.34.56.78機器(即Harbor部署的主機)的ca_files文件夾下的:10.34.56.78.crt10.34.56.78.keyca.crt這三個文件拷貝到my_ca目錄下。
拷貝完成後,進入到my_ca目錄下,運行如下命令:

openssl x509 -inform PEM -in 10.34.56.78.crt -out 10.34.56.78.cert

可以看到my_ca目錄下新生成了10.34.56.78.cert這個文件。
下面我們需要在12.34.56.78這臺機器的/etc/docker/目錄下創建一對父子文件夾(certs.d/10.34.56.78),命令如下:

mkdir –p /etc/docker/certs.d/10.34.56.78

創建完後成,我們將my_ca目錄下的一些文件拷貝到certs.d/10.34.56.78目錄下,即:

cd /home/me/my_ca/
###
cp 10.34.56.78.cert /etc/docker/certs.d/10.34.56.78/
###
cp 10.34.56.78.key /etc/docker/certs.d/10.34.56.78/
###
cp ca.crt /etc/docker/certs.d/10.34.56.78/

接着重啓docker服務:

systemctl restart docker

上面的操作進行完後,我們就能在12.34.56.78這臺機器上 docker login 10.34.56.78 並推送“my_nginx:v1.0”這個image了。
例如在Harbor系統網站內建立一個名爲test的項目,則推送image到該項目下的命令爲:

docker tag my_nginx:v1.0 10.34.56.78/test/my_nginx:v1.0
docker push 10.34.56.78/test/my_nginx:v1.0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章