使用HTTPS訪問Docker私有映象倉庫Harbor的配置方法
由於Harbor未附帶任何證書,因此預設情況下使用HTTP來提供登錄檔請求。 但是,強烈建議為任何生產環境啟用安全性。 Harbor有一個Nginx例項作為所有服務的反向代理,所以可以使用prepare指令碼配置Nginx以啟用https。
考慮到Docker服務訪問Registry已經是預設使用https方式,我們並不希望因為使用Harbor作為映象倉庫,而去修改docker的啟動引數。
獲得證書
假定你的Docker私有倉庫的hostname是reg.yourdomain.com,並且其DNS記錄指向您正在執行Harbor的主機。 您首先應該從CA獲得證書。 證書通常包含a.crt檔案和a.key檔案,例如yourdomain.com.crt和yourdomain.com.key。
在測試或開發環境中,您可以選擇使用自簽名證書而不是CA中的證書。
通過以下命令生成一個自籤的證書:
建立你自己的CA證書
openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
建立一個證書請求
如果您使用reg.yourdomain.com等FQDN連線registry主機,則必須使用reg.yourdomain.com作為證書的CN(通用名稱)。 否則,如果是使用IP地址連線您的registry主機,CN可以是任意字串,例如您的名字等:
openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout 172.16 .10.102.key -out 172.16.10.102.csr
生成證書
如果您使用reg.yourdomain.com等FQDN連線registry主機,請執行此命令以生成registry主機的證書:
openssl x509 -req -days 365 -in yourdomain.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out yourdomain.com.crt
如果您使用IP,例如172.16.10.102來連線registry主機,則可以改為執行以下命令:
echo subjectAltName = IP:172.16 .10.102 > extfile.cnf
openssl x509 -req -days 365 -in 172.16.10.102.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out 172.16.10.102.crt
檢視下都生成了哪些檔案
# ls
172.16.10.102.crt 172.16.10.102.csr 172.16.10.102.key ca.crt ca.key ca.srl extfile.cnf
安裝和配置
在獲取了yourdomain.com.crt和yourdomain.com.key檔案後,可以將它們放入/root/cert/等目錄中:
cp yourdomain.com.crt /etc/harbor/ssl
cp yourdomain.com.key /etc/harbor/ssl
因為我們這個例子中使用的是ip,所以應該執行下面命令:
cp 172.16.10.102.crt /etc/harbor/ssl
cp 172.16.10.102.key /etc/harbor/ssl
接下來,編輯檔案harbor.cfg,更新hostname和protocol,並更新屬性ssl_cert和ssl_cert_key:
#set hostname
hostname = 172.16.10.102
#set ui_url_protocol
ui_url_protocol = https
......
#The path of cert and key files for nginx, they are applied only the protocol is set to https
ssl_cert = /etc/harbor/ssl/172.16.10.102.crt
ssl_cert_key = /etc/harbor/ssl/172.16.10.102.key
為Harbor生成配置檔案:
./prepare
如果Harbor已在執行,請停止並刪除現有例項。 您的映象資料會保留在檔案系統中。
docker-compose down
最後,重啟Harbor服務:
docker-compose up -d
必須將上述步驟中生成的ca.crt複製到/etc/docker/certs.d/reg.yourdomain.com(或您的registry主機IP),如果該目錄不存在,請建立它。 如果您將nginx埠443對映到另一個埠,那麼您應該建立目錄/etc/docker/certs.d/reg.yourdomain.com:port(或您的registry主機IP:port)。
cp ca.crt /etc/docker/certs.d/172.16.10.102/
如果您已將nginx 443埠對映到另一個埠,則需要將埠新增到登入,如下所示:
docker login 172.16.10.102:[PORT]
為Harbor設定HTTPS後,您可以通過以下步驟進行驗證:
- 開啟瀏覽器並輸入地址:https://172.16.10.102。 它應該顯示Harbor的使用者介面。
- 在執行Docker守護程序的計算機上,請確保選項“-insecure-registry”不存在。
- Harbor服務的初始登入賬號為admin/Harbor12345
執行下面docker命令來驗證設定
# docker login 172.16.10.102
Username: admin
Password:
Login Succeeded
[[email protected] harbor]#
# docker tag busybox:latest 172.16.10.102/test-corp/busybox:v1.0
# docker push 172.16.10.102/test-corp/busybox:v1.0
The push refers to repository [172.16.10.102/test-corp/busybox]
f9d9e4e6e2f0: Pushed
v1.0: digest: sha256:5e8e0509e829bb8f990249135a36e81a3ecbe94294e7a185cc14616e5fad96bd size: 527
在瀏覽器頁面中檢視下專案倉庫:
故障排除
1、您可以從證書頒發者那裡獲得中間證書intermediate certificate。 在這種情況下,您應該將中間證書與您自己的證書合併以建立證書包。 您可以通過以下命令實現此目的:
cat intermediate-certificate.pem >> yourdomain.com.crt
2、在某些執行docker守護程式的系統上,您可能需要配置作業系統級別信任該證書。
在Ubuntu上,這可以通過以下命令完成:
cp youdomain.com.crt /usr/local/share/ca-certificates/reg.yourdomain.com.crt
update-ca-certificates
在紅帽系統上,則執行以下命令:
cp yourdomain.com.crt /etc/pki/ca-trust/source/anchors/reg.yourdomain.com.crt
update-ca-trust