需求
原始的需求只是要在內部環境中架設 Nexus Repository 作 docker private repository 但是 預設要使用IP連線還要加上 port 真的是又臭又長。
所以才會想要設定 Nexus Repository 讓他可以使用 https ,減少 docker image 在tag時太長,字要打很多很累的困擾。
例如,原本的指令 docker tag myimg 172.16.3.100:8000/myimg , 設定完之後只要 docker tag myimg docker.local/myimg , 可以少打很多字,果然科技來自於惰性。
想法
利用電腦名稱(這裡用docker.local 為例)取代ip ,而且因為docker client 預設是使用https 也就是443port 做為連線. 如果要儘量縮短網址讓 private repository 使用https連線是最好的做法.
其實也不一定要走https 就能達成目地, 只要在 docker client 修改 daemon.json,加上 "insecure-registries" : ["docker.local"]
然後讓內部用的repository 使用 80port的http 就可以了 。
但缺點就是,每個docker client都要去修改 daemon.json。
所以為了避免去注意到底daemon.json到了改了沒(說到底還是懶) ,使用https還是比較好的做法。
環境
到 https://www.sonatype.com/download-oss-sonatype下載最新版本 Nexus Repository OSS , 目前我是使用 3.16 的版本
步驟
以下步驟主要是參考 Nexus官方文件 https://help.sonatype.com/repomanager3/security/configuring-ssl#ConfiguringSSL-InboundSSL-ConfiguringtoServeContentviaHTTPS
1.用 OpenSSL tool產生給要private repository使用的domain (以 docker.local 為例)憑証 ,產生出來的格式要pfx , 而且匯出時一定要有6個字以上的密碼 ,這裡假設 檔名叫docker.local.pfx, 密碼是123456
怎麼用OpenSSL產生憑証可以參考黑暗大的這篇 https://blog.darkthread.net/blog/iis-ssl-cert-by-openssl/
還有記得要把簽發SSL憑証的根憑証匯到 docker client [本機電腦]層級的[受信任的根憑証單位]裡 , 如果有AD的環境可以用群組原則物件(GPO)派發到每一台電腦參考 https://docs.microsoft.com/zh-tw/windows-server/identity/ad-fs/deployment/distribute-certificates-to-client-computers-by-using-group-policy
2.用 java sdk 附的keytool 將步驟 1 產出的憑証轉成 jks 格式,檔名叫keystore.jks
範例 "C:\Program Files\Java\jdk1.8.0_161\bin\keytool" -importkeystore -srckeystore docker.local.pfx -srcstoretype PKCS12 -srcstorepass 123456 -destkeystore keystore.jks -deststoretype jks -deststorepass 123456
3.把keystore.jks放到 Nexus 的安裝目錄下的/etc/ssl/ 裡
4.修改安裝目錄下的/etc/nexus-default.properties
加上 application-port-ssl=8443 (讓管理介面可以使用https port用 8443)
把nexus-args= 那一行 變成 nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-https.xml,${jetty.etc}/jetty-requestlog.xml
5.修改安裝目錄下的/etc/jetty/jetty-https.xml
把<Set name="KeyStorePassword">123456</Set>
<Set name="KeyManagerPassword">123456</Set>
<Set name="TrustStorePassword">123456</Set>
這3個值都改成憑証的密碼,這邊範例是123456
6.重啟nexus這個windows 服務(如果有把nexus變成windows 服務)
7.用https://docker.local:8443 如果有連上管理介面就表示有啟用成功
8.然後就可以到管理介面把內部用的repository , 使用https打勾 ,內容填上443
9.用browser 連 https://docker.local 有回應就表示設定成功
10.到docker client 使用login的指令測試是否有成功
docker login docker.local
如果出現詢問帳密 就表示設定成功
如果出現 [Get https://docker.local/v2/: x509: certificate signed by unknown authority] 表示沒有把docker.local.pfx 的根憑証, 匯入到[本機電腦]層級的[受信任的根憑証單位]裡
留言列表