啥?雙證書?

國密標準對於SSL通信定義得不是很清楚,所能依仗的標準只有《GMT 0024-2014 SSL VPN 技術規範》。在文檔中提到,國密TLS需要有簽名證書和加密證書。開發伊始並沒有注意到這個細節,以至於在後面的聯調中吃了很多苦頭。現將雙證書的概念以及配置方法總結一下,希望對大家有所幫助。

何爲單證書和雙證書?

通常情況下,服務器會部署一張證書,用於簽名和加密,這就是所謂的單證書:

  • 簽名時,服務器使用自己的私鑰加密信息的摘要(簽名),客戶端使用服務器的公鑰(包含在證書中)進行解密,對比該摘要是否正確,若正確,則客戶端就確定了服務器的身份,即驗籤成功。

  • 加密時,服務器和客戶端協商出會話密鑰(一般爲對稱密鑰),會話密鑰的產生根據密鑰協商算法的不同,過程有所不同,但都會用到證書的公鑰和私鑰,也就是說證書也用在加密場景中。

在單證書配置下,服務器端的公鑰和私鑰由服務器負責保存。私鑰需要特別保存,如果泄漏出去就會有很大的安全風險。客戶端的公鑰和私鑰一般在通信過程中動態產生,客戶端也不會存儲。如果客戶端也要配置證書,這種情形不常見,不在討論之列。

雙證書則包括簽名證書和加密證書:

  • 簽名證書在簽名時使用,僅僅用來驗證身份使用,其公鑰和私鑰均由服務器自己產生,並且由自己保管,CA不負責其保管任務。

  • 加密證書在密鑰協商時使用,其私鑰和公鑰由CA產生,並由CA保管(存根)。

既然單證書可以搞定一切,爲何要使用雙證書?

從道理上來說兩個密鑰具有不同的屬性,邏輯上應該分開處理。其實最主要的原因是國家要保證必要的時候有能力對某些通訊進行監控,如果採用單證書,除了自己誰也無法解密(理論上如此),不利於國家安全。因此某些國家法律規定使用雙證書。如果擁有加密證書的私鑰,可以進行實時監控。使用過wireshark抓HTTPS包的朋友應該知道,如果配置了RSA密鑰,可以解密出HTTPS通信中的加密信息。

關於安全性話題,我並非這方面的專家,也許理解有誤。下面說說如何配置雙證書。

配置雙證書測試環境

TASSL

在《搭建國密SSL開發測試環境》一文中,我介紹了GmSSL這個開源項目。在開發過程中,我也不斷在搜尋資料,後來又發現另一個實現國密的開源項目TASSL。TASSL也是基於OpenSSL開發,由北京江南天安科技有限公司維護,這是中國領先的密碼技術與信息安全綜合服務商。TASSL基於OpenSSL 1.0.2o版本開發,其項目地址爲:

https://github.com/jntass/TASSL/

他們還有一個基於OpenSSL 1.1.1b版本開發的版本,其項目地址爲:

https://github.com/jntass/TASSL-1.1.1b

在這個項目裏面,我找到了配置雙證書的方法。下面就以TASSL開源項目爲例,說說雙證書測試環境的搭建。

編譯TASSL

因爲都是基於OpenSSL開發,其編譯過程和GmSSL差不多,詳細的步驟請參考我之前寫的《搭建國密SSL開發測試環境》。

下面直接給出步驟:

$ git clone https://github.com/jntass/TASSL/
$ cd TASSL
$ chmod a+x config
$ ./config --prefix=/home/alex/work/gmbrowser/usr/local/tassl
$ make
$ make install

如果出現如下錯誤:

/bin/sh: 1: ./pod2mantest: Permission denied
installing man1/CA.pl.1
sh: 1: --p=1: not found
Makefile:646: recipe for target 'install_docs' failed
make: *** [install_docs] Error 127

你可以選擇忽略,因爲這一步是安裝文檔,一般來說用不着。如果要解決,也很簡單。其原因在於克隆下來的文件,某些可執行腳本和文件的可執行屬性整沒了。執行如下的命令,修改util下腳本和可執行文件的可執行屬性,然後再執行一遍make install。

$ chmod a+x ./util/*

設置環境變量:

PATH=$HOME/work/gmbrowser/usr/local/tassl/bin:$PATH
LD_LIBRARY_PATH=$HOME/work/gmbrowser/usr/local/tassl/lib:$LD_LIBRARY_PATH

查看一下版本:

$ openssl version
OpenSSL/TaSSL 1.0.2o  27 Mar 2018

生成簽名證書和加密證書

TASSL提供了一個腳本,可用來生成CA證書、Server證書和Client證書。腳本位於 Tassl_demo/mk_tls_cert/SM2certgen.sh,執行如下命令可以生成全套的測試證書:

$ cd Tassl_demo/mk_tls_cert
$ sh SM2certgen.sh

證書生成在其下的sm2Certs子目錄裏,其中:

  • CA.key.pem和CA.cert.pem分別是CA私鑰和CA證書。

  • CE.cert.pem和CE.key.pem分別是客戶端的加密證書和對應的私鑰。

  • CS.cert.pem和CS.key.pem分別是客戶端的簽名證書和對應的私鑰。

  • SE.cert.pem和SE.key.pem分別是服務器的加密證書和對應的私鑰。

  • SS.cert.pem和SS.key.pem分別是服務器的簽名證書和對應的私鑰。

有人可能注意到,生成的文件還有CA.pem、CE.pem、CS.pem、SE.pem和SS.pem文件,他們是證書和對應的私鑰合併在一起形成的,主要是爲了使用方便。

配置雙證書通信

服務器端:

openssl s_server -accept 44330 -CAfile sm2Certs/CA.pem -cert sm2Certs/SS.pem -enc_cert sm2Certs/SE.pem

客戶端:

openssl s_client -connect 127.0.0.1:4433 -cntls

它們之間通信會使用 ECC-SM4-SM3 密碼套件。

小結

本文介紹了雙證書的來頭,隨後介紹了一個新的國密開源實現TASSL,最後介紹了雙證書的生成和測試環境配置。

如果大家有什麼問題,歡迎交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章