使用OpenSSL建立CA及簽發SSL憑證
5 |
之前曾討論過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專用資料夾:
- 在bin/PEM下建立CA專屬的資料夾,本範例為darkCA
- 建立bin/PEM/darkCA/private,放私鑰用
- 建立bin/PEM/darkCA/newcerts,放簽發的憑證
- 建立一個文字檔案bin/PEM/darkCA/serial(無附檔名),在其中寫入1000,或者可以用echo 1000 > serial建立,該數字被用來產生簽發憑證流水號
- 建立一個全空的文字檔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:A1Certificate 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憑證及密碼並不要輕信來路不明的憑證。
Comments
# by 張政叡
請問如果我要將產出的憑證放到xampp的server裡 該怎麼做?
# by Jeffrey
to 張政叡,xampp就超出我的守備範圍了,抱歉 :P
# by will
hi 黑暗大 請問一下, 假設我要產生SHA256的憑證, 是否加上-sha256就可以了? 我看了憑證資訊有以下兩個資訊, 不知道有甚麼差別呢? 簽章雜湊演算法SHA256 憑證指紋演算法sha1 以上, 謝謝
# by Jeffrey
to will, 你是想解決Google Chrome警告SHA1 SSL憑證有資安風險的問題嗎?我之前有找到一篇文件(但還沒深入研究實測 :P ),先提供給你參考:http://itigloo.com/security/generate-an-openssl-certificate-request-with-sha-256-signature/
# by alen
不用這麼麻煩.www.sslbuyer.com有介面可以直接產生自簽憑證!非常方便! openssl畢竟不是每個人都會! 這網站簡單使用!