顯示具有 Nexus private repository 標籤的文章。 顯示所有文章
顯示具有 Nexus private repository 標籤的文章。 顯示所有文章

2019年5月15日 星期三

設定 Nexus Repository OSS 3.X for Windows 啟用HTTPS(使用自我簽署憑證)

設定 Nexus Repository OSS 3.X for Windows 啟用HTTPS(使用自我簽署憑證)

需求

原始的需求只是要在內部環境中架設 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 

可以少打很多字, 嗯…果然科技來自於惰性。

想法

利用電腦名稱取代ip (這裡用docker.local 為例; 把要當Repository的電腦取名叫 docker, 就可以用 docker.local 連的到)
而且因為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

#讓管理介面可以使用https port用 8443
application-port-ssl=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

把下列這3個值都改成憑証的密碼,這邊範例是123456

<Set name="KeyStorePassword">123456</Set>  
<Set name="KeyManagerPassword">123456</Set>  
<Set name="TrustStorePassword">123456</Set>  

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 的根憑証, 匯入到[本機電腦]層級的[受信任的根憑証單位]裡