之前曾討論過WebClient存取使用自我簽署憑證的SSL連結,會發生以下錯誤:

The underlying connection was closed: Could not establish trust relationship for SSL/TLS secure channel. / 基礎連接已關閉: 無法為 SSL/TLS 安全通道建立信任關係。

需透過ServerCertificateValidationCallback克服。最近又遇到類似情境,但Client程式是別人寫的,修改有困難。決定嘗試另一種做法: 自己搞一個CA,讓Windows信任該CA,如此該CA簽發的憑證直接被視為有效,就可避免前述問題。

Windows Server有Active Directory 憑證服務,缺點是綁了AD權限,不想在正式伺服器亂擺測試用途資料,為此架測試用AD又有點為了喝牛奶養牛,故決定使用獨立軟體工具來處理,OpenSSL,自然是首選。

第一步是下載與安裝OpenSSL。身為C語言麻瓜,沒興趣也沒信心挑戰在Windows平台編譯OpenSSL,當機立斷衝到OpenSSL for Windows下載編譯好的版本。網站的版本很多,我選擇了Win32 OpenSSL v1.0.1e(OpenSSL作者建議開發者安裝的版本),但安裝前要先裝Visual C++ 2008 Redistributables

安裝完成後,在安裝目錄(我的例子是X:\Tools\OpenSSL)的bin目錄下,可以找到openssl.cfg,修改其中CA相關設定:

dir        = ./PEM/darkCA  (要放CA資料的目徑,要手動建目錄及檔案,後面會提)
default_days    = 3650    (預設365,改成十年比較省事)
(以下的預設值請自行依個人狀況調整)
countryName            = TW
countryName_default        = TW
stateOrProvinceName        = Taiwan
stateOrProvinceName_default    = Taiwan
localityName            = Taipei
0.organizationName        = Darkthread
0.organizationName_default    = Darkthread
organizationalUnitName        = HQ
commonName            = darkthread.net (具有識別性的名稱,FQDN也是好選擇)
emailAddress            = nobody@ mail.com.tw

接著準備CA專用資料夾:

    1. 在bin/PEM下建立CA專屬的資料夾,本範例為darkCA
    2. 建立bin/PEM/darkCA/private,放私鑰用
    3. 建立bin/PEM/darkCA/newcerts,放簽發的憑證
    4. 建立一個文字檔案bin/PEM/darkCA/serial(無附檔名),在其中寫入1000,或者可以用echo 1000 > serial建立,該數字被用來產生簽發憑證流水號
    5. 建立一個全空的文字檔bin/PEM/darkCA/index.txt,保存簽發憑證記錄用

下一步,開啟CMD.EXE準備動手。為了省去每次執行工具都要指定openssl.cfg的麻煩,先設定目錄變數
set OPENSSL_CONF=x:\tools\openssl\bin\openssl.cfg

使用以下指令建立CA憑證,參數剛才在openssl.cfg都寫好了,除了PEM密碼,其餘幾乎都可以按Enter用預設值。

X:\Tools\OpenSSL\bin>openssl req -new -x509 -days 3650 -extensions v3_ca -keyout
PEM/darkCA/private/cakey.pem -out PEM/darkCA/cacert.pem
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
..........++++++
.......++++++
writing new private key to 'PEM/darkCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
TW [TW]:
Taiwan [Taiwan]:
Taipei []:
Darkthread [Darkthread]:
HQ []:
darkthread.net []:
nobody @mail.com.tw []:

此時,bin/PEM/darkCA/cacert.pem就建好了,可以開始用它簽發SSL憑證給IIS囉!

取得IIS憑證要求檔(產生步驟請參考保哥的文章),再用openssl產生SSL憑證: (註: openssl.cfg中預設憑證要求檔所輸入的國家、州省、組織名稱必須與CA一致,此點可修改openssl.cfg的[ policy_match ]設定放寬)

X:\Tools\OpenSSL\bin>openssl ca -out iisCert.pem -in webRequest.txt
Using configuration from x:\tools\openssl\bin\openssl.cfg
Loading 'screen' into random state - done
Enter pass phrase for ./PEM/darkCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4096 (0x1000)
        Validity
            Not Before: May 15 04:13:22 2013 GMT
            Not After : May 13 04:13:22 2023 GMT
        Subject:
            countryName               = TW
            stateOrProvinceName       = Taiwan
            organizationName          = Darkthread
            organizationalUnitName    = HQ
            commonName                = localhost
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                C3:8A:CD:2D:69:0C:2F:B3:1C:68:3E:31:11:8A:EA:9B:01:13:74:3A
            X509v3 Authority Key Identifier:
                keyid:72:F8:85:B1:D0:42:EF:EB:3D:C3:2E:B5:C1:FD:E8:AA:B0:52:91:A1

Certificate is to be certified until May 13 04:13:22 2023 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

接著依前述文章的第4步說明,將bin/PEM/darkCA/newcerts/iisCert.pem當成CA送回結果進行"完成憑證"作業,我們這個地下CA所簽發的憑證就在IIS裝好了。不過此時使用SSL連線還是會彈出警告,原因是我們的電腦尚未信任地下CA的根憑證。

開啟IE的網際網路選項,依圖中的(1)到(4),選取【憑證】/ 【受信任的根憑證單位】 / 【匯入】,再指向bin/PEM/darkCA/cacert.pem,按下一步開始匯入。

由於匯入根憑證非同兒戲,Windows會再次詢問確認: "你願意嗎?" "Yes, I do." (提醒: 匯入任何根憑證前請確認憑證來源安全無虞,以免埋下禍害)

完成後,原先用OpenSSL簽發的憑證就會視為有效,但憑證Cache會影響結果,請重新開機或使用第一張圖的【清除SSL狀態】鈕(紅色標示區)清除再做測試。此時可發現,IE已不再跳出任何警告,WebClient取存時也不再出錯囉~

【資安提醒】

經以上操作,自訂CA簽發的憑證都會被Windows直接判定有效,有可能惡意程式也藉此通過檢查獲得更大權限,為避免遭到誤用危險安全,請務必保管好自訂CA憑證及密碼並不要輕信來路不明的憑證。

【延伸參考】Creating an SSL Certificate of Authority


Comments

# by 張政叡

請問如果我要將產出的憑證放到xampp的server裡 該怎麼做?

# by Jeffrey

to 張政叡,xampp就超出我的守備範圍了,抱歉 :P

# by will

hi 黑暗大 請問一下, 假設我要產生SHA256的憑證, 是否加上-sha256就可以了? 我看了憑證資訊有以下兩個資訊, 不知道有甚麼差別呢? 簽章雜湊演算法SHA256 憑證指紋演算法sha1 以上, 謝謝

# by alen

不用這麼麻煩.www.sslbuyer.com有介面可以直接產生自簽憑證!非常方便! openssl畢竟不是每個人都會! 這網站簡單使用!

Post a comment