[CICD] Deploy Nexus on AWS
檸檬爸在 2021 年的時候寫過一篇有關 Nexus 的文章,那時使用的是 Nexus Open Source 的版本,自己部署在 Azure 的 App Service 上面,後來一些緣故研究了雲端的方案,本來是想要託管 Nexus 成一個 Saas 的服務,但是由於價錢太貴,所以還是走雲端自己管理的模式,不過嘗試把 Nexus 從 App Service 搬出來到一個 dedicated VM,本篇紀錄的是使用 AWS 作為雲端服務商部署 Sonaytype Nexus Repository 的服務。
Sonatype Nexus Repository Pricing
企業等級的服務費用是一個月 960 USD,這個是一般 SME 無法負擔,所以轉向使用 AWS Marketplace,不過就算 Marketplace 還是要額外支付費用 0.09 USD/hour。
https://www.sonatype.com/products/pricing
Nexus on AWS Marketplace
Subscribe Nexus 在 AWS 或是 Azure Marketplace 都是免費的,使用者只需要支付 infrastructure 的錢,購買之後,在 AWS Marketplace 頁面裡就可以看到 Launch 的按鈕去驅動部署一個 AWS EC2。


選擇你要的地區與版號,就可以直接部署 EC2。

SSL 設定
部署完的 EC2 instance 預設是跑在 HTTP 80 port,在一般的 CICD 的流程中,Maven 在上傳 jar 檔的時候只會接受有 SSL 保護的 nexus repository,關於 Nexus 的 SSL 設定可以參考,不過這一篇介紹的是 Self-signed 的 certificate,根據你的購買的 SSL 憑證,我們可以利用類似以下的指令將一個 .pfx 的證書換成 keystore.jks。
openssl pkcs12 -in your.pfx -nocerts -nodes -out privkey.pem
# Extract certificate chain
openssl pkcs12 -in your.pfx -clcerts -nokeys -out fullchain.pem
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out nexus-cert.p12 -name nexus
keytool -importkeystore -deststorepass password -destkeypass password -destkeystore keystore.jks -srckeystore nexus-cert.p12 -srcstoretype PKCS12
Note:這樣做出來的 SSL 還是不 secure,因為缺少了 intermediate certificates,透過一些第三方的 certificate 網站,我們得到以下的錯誤訊息:The certificate is not signed by a trusted authority (checking against Mozilla’s root store). If you bought the certificate from a trusted authority, you probably just need to install one or more Intermediate certificates. Contact your certificate provider for assistance doing this for your server platform.
需要另外採用以下的方式進行:
# Extract Your Domain Certificate from .pfx:
openssl pkcs12 -in your.pfx -clcerts -nokeys -out your_domain_cert.pem -passin pass:your_pfx_password
# Download an intermediate certificate from Godaddy https://certs.godaddy.com/repository
wget 'https://certs.godaddy.com/repository/gd_bundle-g2.crt' -O gd_bundle-g2.crt
# Combine certificates
cat your_domain_cert.pem gd_bundle-g2.crt > full_chain_for_keystore.pem
# Update certificate
openssl pkcs12 -export -in full_chain_for_keystore.pem -inkey private_key.pem -name nexus -out temp_full_chain.p12 -passout pass:temp_p12_password
# Import certificate
keytool -importkeystore -srckeystore temp_full_chain.p12 -srcstoretype PKCS12 \
-srcalias nexus \
-srcstorepass temp_p12_password \
-destkeystore keystore.jks \
-deststoretype JKS \
-destalias nexus \
-deststorepass password \
-destkeypass password
設定 DNS
AWS 支援 Quick Setup 可以做到週期性的開關機服務,不過要配合固定的 IP,這樣在轉址上面 DNS 服務商就可以知道說固定要轉到哪一個 URL 上面。