﻿# CollabNet Subversion Edge 安裝筆記 (3)：安裝 SSL 憑證篇

這篇是【[CollabNet Subversion Edge 安裝筆記 (1)：基本安裝設定篇](/post/2011/12/30/CollabNet-Subversion-Edge-Installation-Notes-Part-1-Basic.aspx)】與【[CollabNet Subversion Edge 安裝筆記 (2)：整合 AD 網域篇](/post/2012/01/03/CollabNet-Subversion-Edge-Installation-Notes-Part-2-Active-Directory-Integration.aspx)】系列文章的最後一篇， 主要用來說明如何利用 [OpenSSL](http://www.openssl.org/) 工具與 Java6 的 [keytool.exe](http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/keytool.html) 工具將金鑰安裝至 Java Key Store (JKS) 之中，以及如何正確設定 [Jetty WebServer](http://www.mortbay.org/) 與 [Apache](http://httpd.apache.org/) 能提供 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
```

  ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/19ca10d88c83e611688c-image_1312.png)

**備註**：如果你在執行 openssl 指令時遇到以下錯誤：

```
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
```

建議在執行指令前先設定好 **OPENSSL\_CONF** 環境變數，請執行時先查出你的 Redmine 的安裝目錄：

```
set OPENSSL_CONF=C:\csvn\data\certs\openssl.cnf
```

或可以設定到系統環境變數上：

 ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e3391b31a5e7b84a8c47-image_1313.png)

接著我們要將**金鑰**與**憑證**都轉換成 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
```

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f2ee762e511d13086d8c-image_thumb_82.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/cb770dac001bea913ecf-image_1314.png)

接著我們要建立 **keystore** 檔 (Java Key Store) (JKS)，如果你有安裝 Java6 的話，你可以直接用內建的 [keytool.exe](http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/keytool.html) 執行以下指令匯入憑證（由於是匯入憑證，所以匯入時要指定 **cert.der** 檔案），執行過程中會需要你輸入 keystore 的密碼兩遍，如果要給 CollabNet Subversion Edge 使用，你可以直接輸入 **svnedge** 預設密碼：

```
"C:\Program Files\Java\jre6\bin\keytool.exe" -import -alias importkey -file cert.der
```

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7094a3a9153bd5f8241c-image_1315.png)

執行的過程會問你是否要信任這個憑證，請不要輸入「**是**」，而要輸入英文的「**y**」才對喔！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ce6a0761a54f4076f7e6-image_1316.png)

Java Key Store (JKS) 會被建立在以下目錄：

```
%USERPROFILE%\.keystore
```

**備註**：如果你在執行 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](http://www.agentbob.info/agentbob/81/version/default/part/AttachmentData/data/ImportKey.class "ImportKey.class") 回來，然後執行以下指令匯入：

```
java ImportKey key.der cert.der
```

透過此工具匯入所產生的 keystore 檔預設會被建立在 %USERPROFILE%\\keystore.ImportKey，而且不能指派 keystore 密碼，透過此工具產生的 keystore 密碼皆為 **importkey**：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e482b17d1583957a2823-image_1317.png)

由於存取 keystore 需要密碼，而 [Jetty WebServer](http://www.mortbay.org/) 的設定檔在指定 keystore 密碼時必須以 OBF 格式設定，因此產生 OBF 的 keystore 密碼格式必須採用 [Jetty WebServer](http://www.mortbay.org/) 內建的工具來產生密碼，步驟如下：

1\. 進入 CollabNet Subversion Edge 安裝目錄下的 appserver 目錄

```
cd /D C:\csvn\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**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/63c3285b0b01780a4a9b-image_1318.png)

由於是固定的 importkey 這個密碼，所產生的 OBF 格式如下：

```
OBF:1xtb1uo71wg41y0q1y7z1y101wfu1unr1xu7
```

如果用 **keytool.exe** 產生的檔案為 %USERPROFILE%\\**.keystore** ，如果用 [ImportKey.class](http://www.agentbob.info/agentbob/81/version/default/part/AttachmentData/data/ImportKey.class "ImportKey.class") 產生的檔案為 %USERPROFILE%\\keystore.ImportKey，你可直接將此檔案更名後覆蓋以下檔案：

```
C:\csvn\appserver\etc\svnedge.jks
```

當你置換掉 CollabNet Subversion Edge 內建的 keystore 檔之後，你還必須修改 [Jetty](http://www.mortbay.org/) 的預設設定檔：

```
C:\csvn\appserver\etc\svnedge-ssl.xml
```

開啟該檔後，如果你使用 **keytool.exe** 建立 keystore 檔時密碼設定為 svnedge 的話，你可以不用再編輯此檔案，否則請將剛剛產生出來的 OBF 密碼設定到以下圖示的地方：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b6f58091eedce8af86c9-image_1319.png)

最後，要設定 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 重新啟動即可生效

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e962d3981c989962f769-image_1320.png)

請注意：儲存 PEM 格式的私鑰或憑證檔，一定要用 ANSI + LF 編碼，不能用 UTF8 with BOM 編碼!!

**相關連結**

-   [TeamForge : View Wiki Page: SSL](https://web.archive.org/web/20200425010249/https://ctf.open.collab.net/sf/wiki/do/viewPage/projects.svnedge/wiki/SSL)

-   [Import private key and certificate into Java Key Store (JKS)](http://www.agentbob.info/agentbob/79-AB.html)

-   [StartCom Free SSL Certification Authority](https://web.archive.org/web/20151009112759/https://cert.startcom.org/) ( 真正免費的 SSL 憑證，各平台支援 )

-   [StartSSL™ - The Swiss Army Knife of Digital Certificates & PKI](https://www.startssl.com/)

-   [WARNING: can’t open config file: /usr/local/ssl/openssl.cnf](http://jaspreetchahal.org/warning-cant-open-config-file-usrlocalsslopenssl-cnf/)
-   [应用 openssl 工具进行 SSL 故障分析](http://www.ibm.com/developerworks/cn/linux/l-cn-sclient/index.html)
-   [Import the Certificate as a Trusted Certificate](http://docs.oracle.com/javase/tutorial/security/toolsign/rstep2.html)
-   [SSL Converter - Convert SSL Certificates to different formats](https://www.sslshopper.com/ssl-converter.html)
-   [The Most Common OpenSSL Commands](http://www.sslshopper.com/article-most-common-openssl-commands.html)
-   [keytool - Key and Certificate Management Tool](http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/keytool.html#KeystoreImplementation)
-   [Is it possible to convert an SSL certificate from a .key file to a .pfx?](http://stackoverflow.com/questions/553149/is-it-possible-to-convert-an-ssl-certificate-from-a-key-file-to-a-pfx)
