2018年9月14日 星期五

在 Sonatype Nexus 2 上設定 HTTPS

之前一直用 HTTP,但覺得 HTTP 很不安全,所以趁著這次升級 Sonatype Nexus 的時候,一併來實驗啟用 HTTPS。

環境

在本篇中,使用的 Nexus 2 版本是 2.14.09-01,Java 執行環境是 OpenJDK 1.8.0_181。

準備 Keystore

Sonatype Nexus 2 是內嵌了一個 Jetty 伺服器作為網頁伺服器,因為 Jetty 是 Java Application Server,所以自然需要支援 HTTPS 時需要的是 Keystore 檔案。如果說使用情境跟我一樣是使用 Godaddy 提供的憑證,可以參考之前設定 Tomcat 時建立 Keystore 的步驟 [1],細節這裡就略過了。

設定 HTTPS

主要要啟用 HTTPS,需要設定的是 /{NEXUS_HOME}/conf/jetty-https.xml 這個檔案,對應的參考文件是 [2]。

在 jetty-https.xml 中,設定以下關於憑證的資訊:

<Set name="keyStore">./conf/ssl/keystore.jks</Set>
<Set name="trustStore">./conf/ssl/keystore.jks</Set>
<Set name="keyStorePassword">keyStorePassword</Set>
<Set name="keyManagerPassword">keyManagerPassword</Set>
<Set name="trustStorePassword">trustStorePassword</Set>

這裡的設定是假設我們把 Keystore 檔案改名成 keystore.jks,並且按照 Nexus 2 的預設值一樣放在 /{NEXUS_HOME}/conf/ssl 資料夾裡面。然後同時指定各種憑證所需的密碼即可。

設定 HTTPS 使用的連接埠

要設定連接埠,要調整 /{NEXUS_HOME}/conf/nexus.properties,在裡面追加以下這行,假設我們想把 HTTPS 開在 8443 port:

application-port-ssl=8443
啟用 HTTPS

在官方文件 [2] 中,啟用的動作很簡要地被帶過了,實際上需要做的事情是去修改 /{NEXUS_HOME}/bin/jsw/conf/wrapper.conf,並且在裡面加上新的 Property。例如以我的 Nexus 2.14.09-01 來說,預設的 wrapper.conf 裡面只有以下兩行:

wrapper.app.parameter.1=./conf/jetty.xml
wrapper.app.parameter.2=./conf/jetty-requestlog.xml

這是表示啟用了 HTTP 以及 requestlog,而我們要在底下再追加一行設定以啟用 HTTPS:

wrapper.app.parameter.1=./conf/jetty.xml
wrapper.app.parameter.2=./conf/jetty-requestlog.xml
wrapper.app.parameter.3=./conf/jetty-https.xml

這裡我們先保留 jetty.xml 在上面,追加了 jetty-https.xml,這表示是同時啟用 HTTP 和 HTTPS。設定完以後就完成了,接著重新啟動 Nexus 2 就可以透過 HTTPS 連線了。

啟用 HTTP 自動轉向

在一般網站上常有自動把 HTTP 轉向到 HTTPS 的設定,在 Nexus 2(正確來說是 Jetty)上也可以做這個設定,而且相當地簡單。Nexus 2 已經內建寫好自動轉向的 XML 設定,我們唯一需要做的只有啟用它而已。

wrapper.app.parameter.1=./conf/jetty.xml
wrapper.app.parameter.2=./conf/jetty-requestlog.xml
wrapper.app.parameter.3=./conf/jetty-https.xml
wrapper.app.parameter.4=./conf/jetty-http-redirect-to-https.xml

不過需要稍微注意一點的是,自動轉向是伺服器回覆 HTTP 301 讓瀏覽器自己動作,因此對於不會進行動作的客戶端就沒有效果。例如即使是啟用了自動轉向,在像是 eclipse 的 Maven 專案上,repository 屬性的位置如果還是寫 HTTP,會導致 Maven 回覆無法下載,因為 eclipse 的 Maven 套件不會依據 HTTP 301 做轉向。

參考資料
  1. 在全新的 Tomcat 8 設定 HTTPS
  2. Nexus Repository Manager 2 > Secure Socket Layer SSL > Configuring Inbound HTTPS
  3. Nexus Repository Manager 2 > Installing and Running > Directories
  4. How to Configure HTTPS Protocols Used By Nexus
  5. How to have Jetty redirect http to https

沒有留言: