使用OpenSSL建立CA及簽發SSL憑證

之前曾討論過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

歡迎推文分享:
Published 17 May 2013 07:12 AM 由 Jeffrey
Filed under: , ,
Views: 64,677



意見

# 張政叡 said on 04 November, 2014 03:30 AM

請問如果我要將產出的憑證放到xampp的server裡

該怎麼做?

# Jeffrey said on 04 November, 2014 09:30 AM

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

# will said on 30 January, 2015 06:51 PM

hi 黑暗大

請問一下,

假設我要產生SHA256的憑證, 是否加上-sha256就可以了?

我看了憑證資訊有以下兩個資訊, 不知道有甚麼差別呢?

簽章雜湊演算法SHA256

憑證指紋演算法sha1

以上, 謝謝

# Jeffrey said on 31 January, 2015 08:06 AM

to will, 你是想解決Google Chrome警告SHA1 SSL憑證有資安風險的問題嗎?我之前有找到一篇文件(但還沒深入研究實測 :P ),先提供給你參考:itigloo.com/.../generate-an-openssl-certificate-request-with-sha-256-signature

# alen said on 25 September, 2015 04:00 PM

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

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<May 2013>
SunMonTueWedThuFriSat
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication