這幾天為了替客戶安裝一個 VeriSign 憑證到 Windows 平台的 Apache 2.2 上面傷透腦筋,問了好多朋友都沒有人有這樣的經驗,網路上是有一大堆文章,不過所有的文章都是講如何「自己簽發 SSL 憑證」,但我得到的任務卻是要把一個已經申請下來且已經安裝至 IIS 的憑證安裝到 Apache 2.2 for Win32 中,而我手邊得到的資訊十分有限,只有拿到一個 CA.cer 檔,還有一個已經安裝在 IIS 中且可匯出的 VeriSign 憑證。
首先,我上網找資訊找幾個小時,找的資料也很多,不過大多不符合我的需求,讓我很沒方向感,最後還是跟客戶要到 網際威信(HiTRUST) 的電話,直接打電話到認證客服部詢問安裝的方式,果然專家一出手、便知有沒有,他們很精確的瞭解我的問題並且指導我解決這個問題。
我打算用「最短路徑」說明如何解決這個問題,以下是我本次安裝、設定的完整紀錄:
步驟 0:確認手邊現有的資訊(只要這些就夠了)
- 客戶有提供給我一個 CA.cer 檔案。
- IIS 中已經安裝了 VeriSign 憑證,且憑證的私鑰(Private Key)是可以匯出的。
- 客戶有提供給我當初要申請憑證前所設定的私鑰密碼。
步驟 1:準備相關資料與檔案
- 下載 Apache 2.2 安裝檔並安裝完成
- 中繼憑證檔 ( Server Certificate Chain File )
- 在 Apache 2.2 中預設檔名為 server-ca.crt
- 這個檔案就是客戶提供給我的 CA.cer 檔,建議可以將他改名為 server-ca.crt,並將此檔移至 C:\Program Files\Apache Software Foundation\Apache2.2\conf 目錄下。
- 這個檔案的內容也會在核發憑證下來後的通知信裡面出現,只要將信件中 -----BEGIN CERTIFICATE----- 到 -----END CERTIFICATE----- 為止的內容複製起來,並儲存成 server-ca.crt 檔即可。
- 伺服器憑證檔 ( Server Certificate File )
- 在 Apache 2.2 中預設檔名為 server.crt
- 「伺服器憑證檔」必須先透過 IIS 匯出二進位格式的 PKCS12 私鑰檔 (*.pfx) 轉換成 ASCII 格式的才看的到。
- 伺服器私鑰檔 ( Server Private Key File )
- 在 Apache 2.2 中預設檔名為 server.key
- 「伺服器私鑰檔 」必須先透過 IIS 匯出二進位格式的 PKCS12 私鑰檔 (*.pfx) 轉換成 ASCII 格式的才看的到。
步驟 2:從 IIS 匯出憑證(包括 伺服器憑證 與 伺服器私鑰)
- 開啟已經設定好 SSL 的網站並開啟內容,再切換到[目錄安全設定]頁籤,點選 [伺服器憑證] 按鈕
- 選取 [匯出目前的憑證到 .pfx 檔案],並按 [下一步]
- 輸入要儲存 .pfx 檔案的路徑與檔名
- 輸入當初申請憑證時所設定的密碼
- 最後會顯示匯出憑證摘要,確認後按下 [下一步] 後再按 [完成] 按鈕即可完成匯出。
步驟 3:將 IIS 匯出的 PKCS12 憑證檔 ( C:\mycert.pfx ) 轉換成 Apache 所需的格式
- 透過 Apache 2.2 所附的 openssl.exe 工具進行檔案格式的轉換
- 先開啟「命令提示字元」視窗,並進入 C:\Program Files\Apache Software Foundation\Apache2.2\bin 目錄
- 執行以下指令:
C:\...\Apache2.2\bin> openssl.exe pkcs12 -in c:\mycert.pfx -out c:\mycert.txt -nodes
Enter Import Password:
MAC verified OK
當你輸入 openssl.exe pkcs12 -in c:\mycert.pfx -out c:\mycert.txt -nodes 指令後,會被要求再次輸入憑證密碼,若驗證正確就會建立一個 c:\mycert.txt 檔案。
- 這時用記事本開啟 c:\mycert.txt 檔案,裡面同時包含兩個憑證,分別是 伺服器私鑰(RSA PRIVATE KEY) 與 伺服器憑證(CERTIFICATE)。
- 請在 C:\Program Files\Apache Software Foundation\Apache2.2\conf 目錄下先建立兩個空檔案,檔名分別是 server.key 與 server.crt
- 這時將 c:\mycert.txt 檔案中的兩個憑證內容分別複製到這兩個檔案內,檔案的內容應該只包括 -----BEGIN *----- 到 -----END * ----- 的內容,c:\mycert.txt 中其他的資料都不能出現在這兩個檔案中。
- server.key 的內容會像如下的內容
-----BEGIN RSA PRIVATE KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
................
................
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-----END RSA PRIVATE KEY-----
- server.crt 的內容會像如下的內容
-----BEGIN CERTIFICATE-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
........
........
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-----END CERTIFICATE-----
步驟 4:修改 Apache 設定檔
- 編輯 C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 檔案
- 取消註解 LoadModule ssl_module modules/mod_ssl.so
- 取消註解 Include conf/extra/httpd-ssl.conf
- 編輯 C:\Program Files\Apache Software Foundation\Apache2.2\conf\extra\httpd-ssl.conf 檔案
- 將此檔中所有 _default_ 都改成 *
- 取消註解 SSLCertificateChainFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/server-ca.crt"
步驟 5:重新啟動 Apache22 服務
net stop Apache22
net start Apache22
雖然手續繁雜,但我已經簡化到不能再簡單了。因為這次的經驗讓我更加瞭解 Apache SSL 的設定方式,以後應該不會再遇到問題了。