﻿# 將 IIS 中已安裝的 SSL 憑證移至 Apache 2.2 for Win32 安裝

這幾天為了替客戶安裝一個 [VeriSign](http://www.verisign.com/) 憑證到 Windows 平台的 [Apache](http://httpd.apache.org/) 2.2 上面傷透腦筋，問了好多朋友都沒有人有這樣的經驗，網路上是有一大堆文章，不過所有的文章都是講如何「自己簽發 SSL 憑證」，但我得到的任務卻是要把一個**已經申請下來**且**已經安裝至 IIS 的憑證**安裝到 **Apache 2.2 for Win32** 中，而我手邊得到的資訊十分有限，只有拿到一個 CA.cer 檔，還有一個已經安裝在 IIS 中且可匯出的 VeriSign 憑證。

首先，我上網找資訊找幾個小時，找的資料也很多，不過大多不符合我的需求，讓我很沒方向感，最後還是跟客戶要到 [網際威信(HiTRUST)](http://www.hitrust.com.tw/) 的電話，直接打電話到認證客服部詢問安裝的方式，果然專家一出手、便知有沒有，他們很精確的瞭解我的問題並且指導我解決這個問題。

我打算用「最短路徑」說明如何解決這個問題，以下是我本次安裝、設定的完整紀錄：

**步驟 0：確認手邊現有的資訊**（只要這些就夠了）

1.  客戶有提供給我一個 CA.cer 檔案。
2.  IIS 中已經安裝了 VeriSign 憑證，且憑證的私鑰(Private Key)是可以匯出的。
3.  客戶有提供給我當初要申請憑證前所設定的私鑰密碼。

**步驟 1：準備相關資料與檔案**

1.  下載 Apache 2.2 安裝檔並安裝完成
    -   到 [Downloading the Apache HTTP Server](http://httpd.apache.org/download.cgi) 頁面下載 [Win32 Binary including OpenSSL 0.9.8h (MSI Installer)](https://archive.apache.org/dist/httpd/binaries/win32/apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msi)
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** 檔即可。
3.  伺服器憑證檔 ( Server Certificate File )
    -   在 Apache 2.2 中預設檔名為 **server.crt**
    -   「伺服器憑證檔」必須先透過 IIS 匯出二進位格式的 PKCS12 私鑰檔 (\*.pfx) 轉換成 ASCII 格式的才看的到。
4.  伺服器私鑰檔 ( Server Private Key File )
    -   在 Apache 2.2 中預設檔名為 **server.key**
    -   「伺服器私鑰檔 」必須先透過 IIS 匯出二進位格式的 PKCS12 私鑰檔 (\*.pfx) 轉換成 ASCII 格式的才看的到。

**步驟 2：從 IIS 匯出憑證**（包括 **伺服器憑證** 與 **伺服器私鑰**）

1.  開啟已經設定好 SSL 的網站並開啟內容，再切換到\[**目錄安全設定**\]頁籤，點選 \[伺服器憑證\] 按鈕  
    ![開啟已經設定好 SSL 的網站，並開啟內容，再切換到「目錄安全設定」頁籤，點選 \[伺服器憑證\] 按鈕](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f649a31aa5d1da7e4671-image_3.png)
2.  選取 \[匯出目前的憑證到 .pfx 檔案\]，並按 \[下一步\]  
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4f6645309f99452f7492-image_6.png)
3.  輸入要儲存 .pfx 檔案的路徑與檔名  
    ![輸入要儲存 .pfx 檔案的路徑與檔名](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/00de2af8e5aa739fb2f8-image_9.png)
4.  輸入當初申請憑證時所設定的密碼  
    ![輸入當初申請憑證時所設定的密碼](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a629d6d5c9bbfa20f8cb-image_12.png)
5.  最後會顯示匯出憑證摘要，確認後按下 \[下一步\] 後再按 \[完成\] 按鈕即可完成匯出。  
    ![最後會顯示匯出憑證摘要，確認後按下 \[下一步\] 後再按 \[完成\] 按鈕即可完成匯出。](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3cc2443c348c80da8526-image_15.png)

**步驟 3：將 IIS 匯出的 PKCS12 憑證檔 ( C:\\mycert.pfx ) 轉換成 Apache 所需的格式**

1.  透過 Apache 2.2 所附的 openssl.exe 工具進行檔案格式的轉換
    1.  先開啟「**命令提示字元**」視窗，並進入 **C:\\Program Files\\Apache Software Foundation\\Apache2.2\\bin** 目錄
    2.  執行以下指令：  
        
        ```
        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 檔案。
    3.  這時用記事本開啟 **c:\\mycert.txt** 檔案，裡面同時包含兩個憑證，分別是 **伺服器私鑰**(RSA PRIVATE KEY) 與 **伺服器憑證**(CERTIFICATE)。
    4.  請在 **C:\\Program Files\\Apache Software Foundation\\Apache2.2\\conf** 目錄下先建立兩個空檔案，檔名分別是 **server.key** 與 **server.crt**
    5.  這時將 **c:\\mycert.txt** 檔案中的兩個憑證內容分別複製到這兩個檔案內，檔案的內容應該只包括 -----BEGIN \*----- 到 -----END \* ----- 的內容，c:\\mycert.txt 中其他的資料都不能出現在這兩個檔案中。
        1.  server.key 的內容會像如下的內容
            
            ```
            -----BEGIN RSA PRIVATE KEY-----
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
            ................
            ................
            BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
            -----END RSA PRIVATE KEY-----
            ```
            
        2.  server.crt 的內容會像如下的內容  
            
            ```
            -----BEGIN CERTIFICATE-----
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
            ........
            ........
            BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
            -----END CERTIFICATE-----
            ```
            

**步驟 4：修改 Apache 設定檔**

1.  編輯 **C:\\Program Files\\Apache Software Foundation\\Apache2.2\\conf\\httpd.conf** 檔案
    1.  取消註解 LoadModule ssl\_module modules/mod\_ssl.so
    2.  取消註解 Include conf/extra/httpd-ssl.conf
2.  編輯 **C:\\Program Files\\Apache Software Foundation\\Apache2.2\\conf\\extra\\httpd-ssl.conf** 檔案
    1.  將此檔中所有 \_default\_ 都改成 \*
    2.  取消註解 SSLCertificateChainFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/server-ca.crt"

**步驟 5：重新啟動 Apache22 服務**

```
net stop Apache22
net start Apache22
```

雖然手續繁雜，但我已經簡化到不能再簡單了。因為這次的經驗讓我更加瞭解 Apache SSL 的設定方式，以後應該不會再遇到問題了。
