王森
(國家信息中心信息與網(wǎng)絡(luò)安全部 北京市 100045)
瀏覽器校驗數(shù)字證書能夠?qū)崿F(xiàn)網(wǎng)站信息安全認(rèn)證。其原理是網(wǎng)站事先從權(quán)威認(rèn)證機(jī)構(gòu)CA申請數(shù)字證書,數(shù)字證書包含了網(wǎng)站域名等關(guān)鍵信息,當(dāng)用戶使用瀏覽器通過域名訪問網(wǎng)站時,核驗域名和數(shù)字證書信息是否匹配,并且采用公鑰密碼算法進(jìn)行真實性驗證,核驗通過后才能繼續(xù)加載網(wǎng)站內(nèi)容。該過程需要瀏覽器和網(wǎng)站后端服務(wù)器依據(jù)相關(guān)協(xié)議執(zhí)行驗證流程,該協(xié)議通常采用HTTPS協(xié)議。
雖然HTTPS應(yīng)用廣泛,但支持國產(chǎn)密碼算法及數(shù)字證書的應(yīng)用仍不多,存在瀏覽器、服務(wù)器中間件不支持等問題。本文深入研究了相關(guān)技術(shù),基于開源項目Tassl和360國密瀏覽器實現(xiàn)了國產(chǎn)商用密碼算法和數(shù)字證書HTTPS的網(wǎng)站安全認(rèn)證方案。
網(wǎng)站的安全認(rèn)證需求源于用戶鑒別釣魚網(wǎng)站。釣魚網(wǎng)站通過仿冒真實網(wǎng)站,誘導(dǎo)用戶訪問惡意鏈接,或竊取用戶名、密碼等重要信息。釣魚網(wǎng)站經(jīng)常采用混淆相似域名的方法,例如用數(shù)字“0”代替字母“O”,用小寫字母“l(fā)”代替數(shù)字“1”。攻擊者采用郵件、即時消息等方式,將釣魚網(wǎng)站網(wǎng)址發(fā)送給被攻擊對象。在沒有防備的情況下,很容易打開釣魚網(wǎng)站,進(jìn)而產(chǎn)生個人敏感信息或系統(tǒng)賬號等泄露,往往會造成經(jīng)濟(jì)損失。
啟用數(shù)字證書認(rèn)證,驗證過程首先判斷網(wǎng)站是否擁有合法的數(shù)字證書。沒有數(shù)字證書或數(shù)字證書不是由權(quán)威數(shù)字認(rèn)證機(jī)構(gòu)頒發(fā)的,瀏覽器會進(jìn)行安全提示。數(shù)字認(rèn)證機(jī)構(gòu)在核驗網(wǎng)站認(rèn)證申請時,會嚴(yán)格進(jìn)行審核,包括網(wǎng)站的資質(zhì)、網(wǎng)站的內(nèi)容及網(wǎng)站安全性等,如果發(fā)現(xiàn)網(wǎng)站可能用于“釣魚”,會拒絕發(fā)放數(shù)字證書。防止釣魚網(wǎng)站還需要驗證數(shù)字證書信息,點擊瀏覽器網(wǎng)址左側(cè)的鎖樣圖標(biāo),展開網(wǎng)站的數(shù)字證書詳情進(jìn)行查驗,數(shù)字證書內(nèi)容應(yīng)和目的網(wǎng)站內(nèi)容相符。例如訪問某銀行網(wǎng)站,核查數(shù)字證書的內(nèi)容應(yīng)與官網(wǎng)地址一致。
網(wǎng)站部署證書以便向用戶證明自己是合法、正牌的網(wǎng)站。因此,用戶和網(wǎng)站共同建立數(shù)字證書的安全支撐,用戶客戶端應(yīng)使用安全瀏覽器,不輕易忽略瀏覽器的安全提醒。
在公鑰算法中公鑰和私鑰成對使用,公鑰與真實身份綁定并公開,私鑰由個人保存,并且嚴(yán)格保密不能向其他人泄漏。使用私鑰加密信息生成簽名,作為憑據(jù),核驗人使用簽名者的公鑰驗證簽名。SM2是我國自主研發(fā)的橢圓曲線公鑰算法,具有安全性高、密鑰規(guī)模小等特點。數(shù)字證書是基于公鑰基礎(chǔ)設(shè)施PKI,將公鑰與用戶信息綁定,經(jīng)認(rèn)證后由權(quán)威認(rèn)證機(jī)構(gòu)CA頒發(fā),數(shù)字證書用于實現(xiàn)真實性、抗抵賴等安全特性。
SM2是基于橢圓曲線空間,橢圓曲線的方程為的形式y(tǒng)=x+ax+b,包含相關(guān)特性參數(shù),如素數(shù)空間、基點、基點的階、a和b的值、素域規(guī)模等。其中素數(shù)空間可以是有限域或者二元擴(kuò)域。當(dāng)橢圓曲線參數(shù)不一致時,即使采用相同的運(yùn)算方法,其上的運(yùn)行也不能相互驗證,為此國標(biāo)中對相關(guān)參數(shù)進(jìn)行了定義。
SM2素域選擇有限域F,基點的階為256位,橢圓曲線上的點集記為:
E(F)={(x,y)|x,y∈F且滿足曲線方程y=x+ax+b}∪{O}
其中O是橢圓曲線的無窮遠(yuǎn)點。通過橢圓曲線離散對數(shù)問題(ECDLP)構(gòu)造單向密碼函數(shù):隨機(jī)選擇k,使得Q=[k]G,G應(yīng)滿足是橢圓曲線的一個基點,多倍點計算可以獲得Q,那么求解倍數(shù)k的問題稱為橢圓曲線離散對數(shù)問題。
根據(jù)以上橢圓曲線公鑰算法原理,隨機(jī)生成私鑰d,d為(n-1)范圍內(nèi)的一個隨機(jī)正整數(shù),計算Q=[d]G為曲線E(F)上一個非O點,生成公私鑰對為(d,Q)。此時,公鑰Q需要用坐標(biāo)系中的一個點(x,y)表示,因此私鑰d的長度為256位,而公鑰長度為2個256位,即512位。
從SM2原理可以看出,SM2和RSA算法有較大不同。
(1)建立系統(tǒng)空間的方式不同:RSA不需要設(shè)定參數(shù),可在實數(shù)范圍內(nèi)運(yùn)算;SM2須設(shè)定相關(guān)參數(shù),確定橢圓曲線。
(2)生成密鑰方式不同。RSA同時生成公鑰和私鑰;SM2中先確定私鑰,由私鑰計算公鑰。
(3)簽名算法不同。RSA通過公鑰對簽名結(jié)果進(jìn)行計算,推導(dǎo)源文件;SM2根據(jù)待簽名文件和公鑰計算簽名結(jié)果,將簽名結(jié)果與簽名信息進(jìn)行對比。
在公鑰算法中每個用戶都可以生產(chǎn)公鑰,因此驗證簽名時缺少公鑰與真實身份綁定關(guān)系的證明。認(rèn)證服務(wù)機(jī)構(gòu)和公鑰基礎(chǔ)設(shè)施PKI由于真實性證明,認(rèn)證服務(wù)機(jī)構(gòu)CA是具有良好信譽(yù)的服務(wù)部門,將用戶信息與公鑰信息打包一起簽名,實現(xiàn)用戶信息認(rèn)證。因此數(shù)字證書的本質(zhì)是數(shù)字簽名文件,使用認(rèn)證服務(wù)機(jī)構(gòu)私鑰對用戶信息與公鑰綁定關(guān)系進(jìn)行簽名。數(shù)字證書的有效性驗證,可以通過認(rèn)證服務(wù)機(jī)構(gòu)的證書,對用戶證書驗證。
申請數(shù)字證書過程通常包括以下步驟:
(1)用戶為申請數(shù)字證書,本地生成公鑰和私鑰。私鑰應(yīng)保存在安全密碼模塊中,具有不可導(dǎo)出、不可見等特性,使用時通過調(diào)用密碼服務(wù)應(yīng)用接口。
(2)用戶與CA進(jìn)行交互。向CA提交數(shù)字證書制作請求,請求文件中包含需要公開相關(guān)信息和用戶公鑰。
(3)CA會嚴(yán)格驗證信息的真實性,并核對合法性、合理性。驗證通過后,CA使用自己的私鑰,將包含網(wǎng)站信息和公鑰的文件進(jìn)行數(shù)字簽名,最后按照數(shù)字證書規(guī)范格式,封裝網(wǎng)站信息、網(wǎng)站公鑰、數(shù)字簽名封裝,并下發(fā)給用戶。
GB/T 20518-2018《信息安全技術(shù) 公鑰基礎(chǔ)設(shè)施 數(shù)字證書格式》定義了數(shù)字證書的格式,證書主結(jié)構(gòu)及TBSCertificate、extensions的字段。網(wǎng)站證書必須填寫擴(kuò)展項中密鑰用法KeyUsage和主體可替換名稱subjectAltName兩個字段信息,按照TLCP協(xié)議要求,網(wǎng)站應(yīng)提供簽名證書和加密證書,簽名證書KeyUsage應(yīng)為digitalSignature和nonRepudiation,加密證書KeyUsage應(yīng)為dataEncipherment。subjectAltName必須為網(wǎng)站的url地址,否則瀏覽器無法完成網(wǎng)站證書校驗。
HTTPS協(xié)議是SSL安全協(xié)議封裝的HTTP協(xié)議。SSL是傳輸層安全協(xié)議,我國標(biāo)準(zhǔn)應(yīng)依據(jù)GB/T 38636-2020《信息安全技術(shù) 傳輸層密碼協(xié)議(TLCP)》,其內(nèi)容主要描述了數(shù)字證書認(rèn)證和密鑰交換過程,包括預(yù)主密鑰協(xié)商、計算主密鑰、推導(dǎo)工作密鑰、使用工作密鑰進(jìn)行加解密和完整性校驗等。
記錄層協(xié)議是傳輸層加密的核心,位于傳輸層報頭后的載荷部分。記錄層協(xié)議接收應(yīng)用層數(shù)據(jù),通過分塊、壓縮、加密處理,放入傳輸層載荷中傳輸。接收到的數(shù)據(jù)經(jīng)過解密、驗證、解壓縮、重新封裝,傳送給高層應(yīng)用。
記錄層協(xié)議包含4中類型,握手、報警、密碼規(guī)格變更、應(yīng)用數(shù)據(jù)等類型,類型標(biāo)識的位置數(shù)據(jù)報的標(biāo)頭,數(shù)據(jù)載荷如圖1所示。
圖1:記錄層格式詳解
通過握手協(xié)議實現(xiàn)安全認(rèn)證和密鑰交換過程,包括以下協(xié)商步驟,如圖2所示。
圖2:握手協(xié)議過程
(1)交換hello消息來協(xié)商密碼套件,以及隨機(jī)數(shù)??蛻舳税l(fā)送客戶端hello消息給服務(wù)端,服務(wù)端應(yīng)回應(yīng)hello消息。
(2)服務(wù)器交換必要的參數(shù),實現(xiàn)預(yù)主密鑰協(xié)商,交換服務(wù)器證書;
(3)雙方根據(jù)隨機(jī)數(shù)生成預(yù)主密鑰及主密鑰;
(4)在協(xié)議棧中,記錄層調(diào)用握手協(xié)議產(chǎn)生的主密鑰,使用協(xié)商的算法等安全參數(shù)生成記錄層數(shù)據(jù);
(5)驗證握手過程的真實性和完整性。
客戶端Hello消息標(biāo)明客戶端支持的密碼套件列表,套件的排序按照客戶端優(yōu)先級順序排列。每個密碼套件包括一個密鑰交換算法,一個加密算法和一個校驗算法,目前新版國標(biāo)較國密標(biāo)準(zhǔn)在密碼套件定義方面有所改變,去掉了SM1和SHA1,添加了SHA256。詳細(xì)信息見表1。
表1:國家標(biāo)準(zhǔn)支持的密碼套件
服務(wù)端在密碼套件列表中選擇一個與之匹配的密碼套件,如果沒有可匹配的密碼套件,應(yīng)返回握手失敗報警消息并且關(guān)閉連接。按安全協(xié)議規(guī)定,服務(wù)端必須發(fā)送一個服務(wù)端證書消息提供客戶端驗證,因此Server Certificate總是跟在Server Hello消息之后,消息的內(nèi)容為服務(wù)端的簽名證書和加密證書。證書格式為X.509 v3,證書使用類型KeyUsage必須能適用已經(jīng)確定的密鑰交換算法,并且簽名證書在前,加密證書在后。
國密瀏覽器是支持國密HTTPS和國密數(shù)字證書的瀏覽器,目前已有齊安信瀏覽器、360瀏覽器、紅蓮花瀏覽器、密信瀏覽器等多個國產(chǎn)瀏覽器。國密瀏覽器訪問網(wǎng)站時,驗證網(wǎng)站的數(shù)字證書,包括驗證數(shù)字證書的有效性和證書鏈有效性兩個步驟。
4.1.1 驗證數(shù)字證書的有效性
經(jīng)過HTTPS握手過程,實現(xiàn)了以下相關(guān)信息的驗證。
(1)網(wǎng)站擁有數(shù)字證書對應(yīng)的私鑰,即網(wǎng)站是數(shù)字證書真正擁有者,安全協(xié)議驗證了私鑰,保證偽造網(wǎng)站無法使用原網(wǎng)站證書。
(2)驗證頒發(fā)者的數(shù)字簽名,確認(rèn)數(shù)字證書是經(jīng)合法權(quán)威機(jī)構(gòu)簽發(fā)。
(3)驗證數(shù)字證書有效期。使用時間應(yīng)在數(shù)字證書生效的起始時間和結(jié)束時間。
(4)數(shù)字證書沒有被吊銷。認(rèn)證服務(wù)機(jī)構(gòu)可以吊銷數(shù)字證書,并將序號存儲在吊銷文件CRL中,驗證過程核查了CRL是否包含當(dāng)前數(shù)字證書的序列號。
4.1.2 驗證數(shù)字證書鏈
大部分運(yùn)行CA都是由一級CA簽發(fā)的,例如CA_1是由CA_0進(jìn)行簽發(fā)的,需要用CA_0的公鑰,驗證CA_1數(shù)字證書的簽名。CA_0是簽發(fā)CA的CA,通常是權(quán)威認(rèn)證機(jī)構(gòu)的根CA,根CA不用來制作用戶的數(shù)字證書。認(rèn)證服務(wù)機(jī)構(gòu)根據(jù)不同的應(yīng)用領(lǐng)域,使用根CA制發(fā)不同的運(yùn)行CA。
當(dāng)驗證運(yùn)行CA頒發(fā)的用戶數(shù)字證書時,需要提供根CA和運(yùn)行CA的數(shù)字證書,包括用戶的數(shù)字證書共3張證書一起證明用戶身份。使用時可以將3張證書打包成一個壓縮文件。權(quán)威機(jī)構(gòu)根CA可以預(yù)置在操作系統(tǒng)或瀏覽器中。
圖3是一個證書鏈的示例,位于左側(cè)CFCA SM2是一個運(yùn)行CA,右側(cè)ROOTCA為我國國密SM2根證書。CFCA SM2數(shù)字證書的授權(quán)密鑰標(biāo)識表示為KeyID=4c32b197d93 31bc4a605c1c6e58b625bf0977658,查看右側(cè)ROOTCA的授權(quán)密鑰標(biāo)識也為KeyID=4c32b197d9331bc4a605c1c6e58b625 bf0977658,ROOTCA是自簽根,可以證明CFCA SM2是由ROOTCA頒發(fā)的。
圖3:CFCA SM2證書鏈?zhǔn)纠?/p>
國際GlobalSign、VeriSign等認(rèn)證機(jī)構(gòu)不支持我國國密算法的數(shù)字證書。一般由國內(nèi)認(rèn)證服務(wù)機(jī)構(gòu)頒發(fā)SM2算法數(shù)字證書。目前,我國已建成國家電子認(rèn)證根,并公布了4個電子認(rèn)證根,其中社會公眾應(yīng)用根(SM2),其主題項為CN=ROOTCA,O=NRCAC,C=CN,即為CFCA SM2的簽發(fā)CA。
360安全瀏覽器國密專版增加了密碼模塊和安全協(xié)議模塊,實現(xiàn)了對國產(chǎn)密碼算法和安全協(xié)議的完整支持,10.1beta中已經(jīng)帶有了國產(chǎn)密碼模塊和安全協(xié)議模塊,不再以專版的形式發(fā)布。密信瀏覽器基于 Chromium 開放源代碼項目開發(fā)(版本:Chromium 66),主要增加了對國密算法SM2/SM3/SM4的支持,支持國密SSL證書。齊安信瀏覽器發(fā)布了《商用密碼證書可信計劃》,目前已發(fā)布14家國密SM2數(shù)字證書,例如北京數(shù)字認(rèn)證股份有限公司Beijing SM2 CA、中金金融認(rèn)證中心有限公司CFCA CS SM2 CA等。
江南天安通過開源方式提供一種國密服務(wù)器搭建方法,開源項目名稱為Tassl,包含一套提供國密算法支持的OpenSSL算法庫,以及支持Tassl的Ngnix。編譯安裝該版本Nginx后,可以先利用測試證書驗證系統(tǒng)運(yùn)行。生成證書示例腳本程序為gen_sm2_cert.sh,運(yùn)行完成后,生成可供測試使用相關(guān)國密數(shù)字證書。修改nginx服務(wù)器的配置文件nginx.conf,添加數(shù)字證書和私鑰相關(guān)配置。
重新啟動Ngnix,使用360瀏覽器訪問服務(wù)器。此時服務(wù)端測試的根證書還沒有預(yù)添加到瀏覽器可信數(shù)字證書列表中,網(wǎng)站URL前仍然會提示一個打紅叉的鎖,代表證書鏈沒有通過驗證,如圖4所示。此時需要把Tassl生成的CA.crt文件保存到360國密瀏覽器ctl.dat文件中。此后重啟瀏覽器,瀏覽器加載根證書后,瀏覽器不再進(jìn)行報警。
圖4:瀏覽器地址欄的報警提示
近期,俄羅斯因俄烏沖突受美國制裁,很多全球性電子認(rèn)證服務(wù)機(jī)構(gòu)不再簽發(fā)俄羅斯的數(shù)字證書申請,導(dǎo)致俄羅斯國內(nèi)很多網(wǎng)站證書面臨過期失效風(fēng)險。此事件也為我國敲響警鐘,密碼等核心技術(shù)不能受“卡脖子”限制。在電子認(rèn)證服務(wù)領(lǐng)域,我們擁有自主知識產(chǎn)權(quán)的SM2算法,并且建立了以國家根為信任源點的多級電子認(rèn)證服務(wù)體系。近年來,我國的安全可信生態(tài)體系逐步成熟,選用安全的產(chǎn)品也成為政府、企業(yè)開展系統(tǒng)建設(shè)的首要因素,國密瀏覽器成熟度越來越高,用戶數(shù)量和市場占有了較大提升。本文介紹了網(wǎng)站身份認(rèn)證的基本概念,分析了網(wǎng)站認(rèn)證的安全需求,詳細(xì)介紹了國密公鑰算法、國密數(shù)字證書、國密根認(rèn)證體系、證書鏈等,基于360國密瀏覽器和開源項目Tassl,實現(xiàn)了一個完整的國密網(wǎng)站認(rèn)證方案。為開展國密改造的網(wǎng)站管理者提供了參考方案。