這篇是【CollabNet Subversion Edge 安裝筆記 (1):基本安裝設定篇】與【CollabNet Subversion Edge 安裝筆記 (2):整合 AD 網域篇】系列文章的最後一篇, 主要用來說明如何利用 OpenSSL 工具與 Java6 的 keytool.exe 工具將金鑰安裝至 Java Key Store (JKS) 之中,以及如何正確設定 Jetty WebServer 與 Apache 能提供 SSL 連線,當時真的搞好久,寫完此篇文章後我就決定把他從我腦中移開,哈哈。
在安裝 SSL 憑證之前,我先假設各位已經取得內含私密金鑰的 PKCS#12 檔案,正常的情況下這類檔案的副檔名為 *.pfx 或 *.p12 等,拿到 PKCS#12 私密金鑰檔後,先透過 OpenSSL.exe 工具產生一組 All in One (所有相關檔案都集中在一個檔案裡) 的憑證檔,減少後續操作的複雜度。
備註:由於 CollabNet Subversion Edge 已內建此工具,執行檔路徑在 C:\csvn\bin\openssl.exe
假設你的 PKCS#12 檔案名稱為 server.p12,執行完以下指令後會先需要輸入金鑰密碼,成功後會再要求你再輸入兩次 PEM 密碼,你直接輸入跟你原本的金鑰密碼即可,完成後會產生 all-in-one.key 檔案。
openssl pkcs12 -info -in server.p12 > all-in-one.key
備註:如果你在執行 openssl 指令時遇到以下錯誤:
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
建議在執行指令前先設定好 OPENSSL_CONF 環境變數,請執行時先查出你的 Redmine 的安裝目錄:
set OPENSSL_CONF=C:\csvn\data\certs\openssl.cnf
或可以設定到系統環境變數上:
接著我們要將金鑰與憑證都轉換成 DER 格式:
1. 轉換金鑰為 key.der 檔案,指令執行的過程中會需要再輸入一次金鑰密碼:
openssl pkcs8 -topk8 -nocrypt -in all-in-one.key -inform PEM -out key.der -outform DER
2. 轉換憑證為 cert.der 檔案,指令執行的過程中不需要再輸入金鑰密碼:
openssl.exe x509 -in all-in-one.key -inform PEM -out cert.der -outform DER
接著我們要建立 keystore 檔 (Java Key Store) (JKS),如果你有安裝 Java6 的話,你可以直接用內建的 keytool.exe 執行以下指令匯入憑證(由於是匯入憑證,所以匯入時要指定 cert.der 檔案),執行過程中會需要你輸入 keystore 的密碼兩遍,如果要給 CollabNet Subversion Edge 使用,你可以直接輸入 svnedge 預設密碼:
"C:\Program Files\Java\jre6\bin\keytool.exe" -import -alias importkey -file cert.der
執行的過程會問你是否要信任這個憑證,請不要輸入「是」,而要輸入英文的「y」才對喔!
Java Key Store (JKS) 會被建立在以下目錄:
備註:如果你在執行 keytool.exe 指令時遇到以下錯誤,建議刪除預設的 %USERPROFILE%\.keystore 檔案:
keytool 錯誤: java.io.IOException: Keystore was tampered with, or password was incorrect
如果要更新憑證,你可能會想先刪除之前的憑證,參考指令如下:
"C:\Program Files\Java\jre6\bin\keytool.exe" -delete -alias importkey
如果你沒有 Java6 的話 ( 例如 Java 1.5 ),那步驟會麻煩些,你必須先下載 ImportKey.class 回來,然後執行以下指令匯入:
java ImportKey key.der cert.der
透過此工具匯入所產生的 keystore 檔預設會被建立在 %USERPROFILE%\keystore.ImportKey,而且不能指派 keystore 密碼,透過此工具產生的 keystore 密碼皆為 importkey:
由於存取 keystore 需要密碼,而 Jetty WebServer 的設定檔在指定 keystore 密碼時必須以 OBF 格式設定,因此產生 OBF 的 keystore 密碼格式必須採用 Jetty WebServer 內建的工具來產生密碼,步驟如下:
1. 進入 CollabNet Subversion Edge 安裝目錄下的 appserver 目錄
2. 執行以下指令,最後一個參數為要產生 OBF 格式的密碼,在這裡我們用 importkey
java -cp lib\jetty-http-7.0.2.v20100331.jar;lib\jetty-util-7.0.2.v20100331.jar org.eclipse.jetty.http.security.Password importkey
由於是固定的 importkey 這個密碼,所產生的 OBF 格式如下:
OBF:1xtb1uo71wg41y0q1y7z1y101wfu1unr1xu7
如果用 keytool.exe 產生的檔案為 %USERPROFILE%\.keystore ,如果用 ImportKey.class 產生的檔案為 %USERPROFILE%\keystore.ImportKey,你可直接將此檔案更名後覆蓋以下檔案:
C:\csvn\appserver\etc\svnedge.jks
當你置換掉 CollabNet Subversion Edge 內建的 keystore 檔之後,你還必須修改 Jetty 的預設設定檔:
C:\csvn\appserver\etc\svnedge-ssl.xml
開啟該檔後,如果你使用 keytool.exe 建立 keystore 檔時密碼設定為 svnedge 的話,你可以不用再編輯此檔案,否則請將剛剛產生出來的 OBF 密碼設定到以下圖示的地方:
最後,要設定 Subversion / HTTP 介面的 SSL 憑證,這部份由於是採用 Apache Web Server 所以請參考以下設定步驟:
1. 準備 server.crt 檔案並放到以下路徑 "D:\csvn\data\conf\server.crt"
openssl x509 -inform DER -in cert.der -out server.crt
2. 準備 server.key 檔案並放到以下路徑 "D:\csvn\data\conf\server.key"
openssl.exe pkcs8 -in all-in-one.key -inform PEM -out server.key
3. 取得憑證商提供的中繼憑證 (Intermediate CA) 並更名為 server.ca 放到 D:\csvn\data\conf\ 目錄,並開啟編輯 C:\csvn\data\conf\csvn_main_httpd.conf 檔案,並加入以下這行即可。
SSLCertificateChainFile "C:\csvn\data\conf\server.ca"
最後,進入服務管理員把 CollabNet Subversion Edge 與 CollabNet Subversion Server 重新啟動即可生效
請注意:儲存 PEM 格式的私鑰或憑證檔,一定要用 ANSI + LF 編碼,不能用 UTF8 with BOM 編碼!!
相關連結