應(yīng)用數(shù)字證書 保證交易安全
應(yīng)用數(shù)字證書 保證交易安全2007-01-02 10:48:18網(wǎng)絡(luò)的安全問題得到人們的日益重視。網(wǎng)絡(luò)面臨的威脅五花八門:內(nèi)部竊密和破壞、截收、非法訪問、破壞信息的完整性、冒充和破壞系統(tǒng)的可用性、重演
應(yīng)用數(shù)字證書 保證交易安全
2007-01-02 10:48:18
網(wǎng)絡(luò)的安全問題得到人們的日益重視。網(wǎng)絡(luò)面臨的威脅五花八門:內(nèi)部竊密和破壞、截收、非法訪問、破壞信息的完整性、冒充和破壞系統(tǒng)的可用性、重演及抵賴等。于是公鑰基礎(chǔ)設(shè)施(Public Key Infrastructure,PKI )應(yīng)運(yùn)而生。PKI 是電子商務(wù)和其它信息系統(tǒng)的安全基礎(chǔ),用來建立不同實(shí)體間的“信任”關(guān)系。它的基礎(chǔ)是加密技術(shù),核心是證書服務(wù)。用戶使用由證書授權(quán)認(rèn)證中心(Certificate Authority,CA )簽發(fā)的數(shù)字證書,結(jié)合加密技術(shù),可以保證通信內(nèi)容的保密性、完整性、可靠性及交易的不可抵賴性,并可以進(jìn)行用戶身份的識(shí)別。 本文分析公鑰基礎(chǔ)設(shè)施涉及的5個(gè)主要算法和應(yīng)用:數(shù)字簽名、數(shù)字信封、數(shù)字證書、私鑰管理和密鑰協(xié)定,描述目前電子政務(wù)CA 建設(shè)中雙證書體系的概念,接著講述如何用Openssl 作認(rèn)證中心、申請(qǐng)證書和使用證書,最后講述SSL 協(xié)議如何使用證書和加密技術(shù)建立安全通信通道。
數(shù)字證書算法
數(shù)字簽名
數(shù)字簽名算法包括簽名過程和識(shí)別過程兩部分(見圖1)。簽名過程是簽名者使用自己的私鑰對(duì)消息的摘要進(jìn)行加密的過程,被加密的摘要就是簽名。為什么只對(duì)消息的摘要進(jìn)行加密呢?因?yàn)樗械墓€加密算法在加密速度上比較慢(相對(duì)對(duì)稱加密算法),同時(shí)消息摘要算法具有單一性,即不可能具有兩個(gè)消息在同一摘要算法的運(yùn)算下產(chǎn)生相同的摘要,算法產(chǎn)生的消息摘要具有固定長(zhǎng)度(比如128位),所以利用公鑰加密算法才比較合適。簽名和原消息一起形成了簽名消息。簽名消息經(jīng)過信息傳遞渠道可以發(fā)送到多個(gè)接收者手中,后者利用消息發(fā)送者的證書對(duì)簽名進(jìn)行解密,得到摘要2,簽名消息中的原文被同樣的摘要算法進(jìn)行運(yùn)算得到消息摘要1,兩個(gè)摘要進(jìn)行對(duì)比,接收者就可以判斷消息的完整性。同樣發(fā)送者也不能對(duì)消息的發(fā)送進(jìn)行抵賴。值得注意的是,整個(gè)過程中,接收者不需要任何自己的東西,任何人只要具有發(fā)送者的證書,不會(huì)涉及一絲的保密信息就可以驗(yàn)證消息。
數(shù)字簽名中的證書在雙證書機(jī)制中也被稱為簽名證書,簽名證書的私鑰被消息的發(fā)送者唯一保存。
,圖1 數(shù)字簽名過程圖
數(shù)字信封
數(shù)字信封就是消息加密,具體操作見圖2。利用對(duì)稱加密算法(比如DES) 對(duì)比較長(zhǎng)的消息(相對(duì)密鑰) 進(jìn)行加密,再利用接收者的證書對(duì)密鑰進(jìn)行加密,加密消息和加密密鑰一起發(fā)送給消息接收者。后者利用自己的私鑰對(duì)加密密鑰解密得到密鑰,接著用密鑰對(duì)加密消息進(jìn)行解密得到消息原文。與數(shù)字簽名一樣,消息的發(fā)送者不會(huì)涉及任何保密內(nèi)容,只要知道接收者證書的人都可以向他發(fā)送數(shù)據(jù)信封封裝消息。
數(shù)字信封應(yīng)用不僅在商業(yè)中很受關(guān)注,在國(guó)家安全和商業(yè)損失上都很受重視,相應(yīng)的私鑰托管就出現(xiàn)了。私鑰托管指證書的所有者除了自己擁有證書對(duì)應(yīng)的私鑰外,還必須把自己的私鑰交給一個(gè)或多個(gè)國(guó)家指定的托管機(jī)構(gòu)進(jìn)行保管。為了加強(qiáng)安全和減少腐敗,每個(gè)托管機(jī)構(gòu)只保管私鑰的一部分。私鑰托管可以應(yīng)付以下情況:當(dāng)私鑰的所有者丟失私鑰,但手頭已有大量的重要數(shù)字信封封裝消息時(shí),私鑰的所有者可以申請(qǐng)獲得私鑰。當(dāng)國(guó)家機(jī)關(guān)獲得授權(quán)要對(duì)某個(gè)可疑人士進(jìn)行信息跟蹤時(shí),可以申請(qǐng)獲得私鑰。數(shù)字信封應(yīng)用中的證書在雙證書體系中又叫加密證書。注意數(shù)字信封應(yīng)用中加密消息的不是證書本身,而是公鑰加密的密鑰。
,圖二 數(shù)字信封
數(shù)字證書
證書的申請(qǐng)者利用對(duì)稱鑰算法產(chǎn)生一對(duì)公鑰和私鑰,接著使用證書申請(qǐng)算法把自己的標(biāo)識(shí)和公鑰變成證書簽名申請(qǐng)文件。CA 證書認(rèn)證中心用自己的私鑰對(duì)證書信息進(jìn)行簽名形成申請(qǐng)者的證書。
CA 也可以用數(shù)字簽名發(fā)放證書收回列表(見圖3)。在證書信息中可以有證書擁有者的名字、電子郵件、授權(quán)信息等其它消息。
,圖三 數(shù)字證書
私鑰管理
私鑰在PKI 系統(tǒng)中非常重要,私鑰的泄密會(huì)給所有者造成不可預(yù)估的損失。在個(gè)人的私鑰管理中,一般通過口令對(duì)私鑰進(jìn)行加密保存,另用“所有和所知”雙重防護(hù)進(jìn)行保護(hù)。這種方法適用于簽名證書私鑰的管理,見圖4。
為了監(jiān)視和防止計(jì)算機(jī)犯罪活動(dòng),人們提出了密鑰托管(Key Escrow ,KE )的概念,指國(guó)家強(qiáng)制規(guī)定進(jìn)行的私鑰托管。為防止用戶逃避托管,密鑰托管技術(shù)的實(shí)施需要通過政府的強(qiáng)制措施進(jìn)行。用戶必須先委托密鑰托管機(jī)構(gòu)(KEA )進(jìn)行密鑰托管,取得托管證書,才能向CA 申請(qǐng)加密證書。CA 必須在收到加密公鑰對(duì)應(yīng)的私鑰托管證書后,再簽發(fā)相應(yīng)的公鑰證書。為了防止KEA 濫用權(quán)限及托管密要的泄漏,用戶的私鑰被分成若干部分,由不同的密鑰托管機(jī)構(gòu)負(fù)責(zé)保存。只有將所有的私鑰分量合在一起,才能恢復(fù)用戶私鑰的有效性。用戶選擇若干個(gè)KEA ,分給每一個(gè)代理一部分私鑰和一部分公鑰。代理根據(jù)所得的密鑰分量產(chǎn)生相應(yīng)的托管證書。證書中包括該用戶的特定表示符(Unique Identify,UID )、被托管的那部分公鑰和私鑰、托管證書的編號(hào)。KEA 還要用自己的簽名私鑰對(duì)托管證書進(jìn)行加密,產(chǎn)生數(shù)字簽名,并將其附在托管證書上。用戶收到所有的托管證書后,將證書和完整的公鑰遞交給CA ,然后申請(qǐng)證書。這種機(jī)制適用于加密證書私鑰的管理。這樣簽名證書的私鑰世界上只有一份,而加密證書私鑰就可能有若干份了。
,圖四 私鑰管理
密鑰協(xié)定
密鑰算法在加密大規(guī)模內(nèi)容時(shí)更加有效(見圖5) 。使得通信雙方對(duì)加密密鑰達(dá)成共識(shí)的應(yīng)用叫密鑰協(xié)定。內(nèi)容傳輸之前雙方經(jīng)過密鑰協(xié)定算法得到共同的密鑰,之后大家就可以利用非對(duì)稱加密算法對(duì)通信信道進(jìn)行加密。典型的密鑰協(xié)定有PKCS #3,即Diffie-Hellman 協(xié)定標(biāo)準(zhǔn)。 PKCS #3算法由兩個(gè)階段組成,而且通信雙方都是互相獨(dú)立運(yùn)算。第二階段互用對(duì)方第一階段的公有輸出值作為輸入的一部分,最后得到一致的密鑰。密鑰不必在通信信道上傳輸。其實(shí)在數(shù)字信封中也有密鑰交換的過程,只是密鑰由發(fā)送方計(jì)算,用接受方公鑰加密,接著傳輸給接受方。因?yàn)槊荑€被接受方的公鑰加密,所以只有接受方能解密得到密鑰。
,圖五 密鑰協(xié)定
使用Openssl 管理證書
服務(wù)方制作CA
1.為CA 生成一個(gè)私鑰
$ openssl genrsa -des3 -out ca.key 1024
用以上命令將生成一個(gè)RSA 私鑰,利用Triple-DES 加密,輸出格式為PEM 。備份上面生成的私鑰ca.key 很重要。在指令執(zhí)行期間,需要輸入訪問私鑰的口令。這個(gè)口令需要好好保存。
$ openssl rsa -noout -text -in ca.key
上面的指令可以顯示私鑰的內(nèi)容,指令處理私鑰之前會(huì)向你詢問訪問私鑰的口令。用下面的指令可以生成一個(gè)不需要口令保護(hù)的私鑰,但不建議這樣做:
$ openssl rsa -in ca.key -out ca.key.unsecure
上面的三個(gè)指令用的都是RSA 體系,OPENSSL 還提供DSA 體系指令。
2.用私鑰創(chuàng)建一個(gè)自簽名X509 證書
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt
以上指令用剛才生成的私鑰制作了一個(gè)自簽名的證書,雖然req 命令主要用于生成和處理證書請(qǐng)求,生成自簽名證書是一個(gè)額外的功能。你可以用下面的指令查看證書的內(nèi)容:
,$ openssl x509 -noout -text -in ca.crt
服務(wù)方制作證書管理環(huán)境
證書的管理有證書系列號(hào)的分配、證書的保存、證書的狀態(tài),Openssl 提供的CA 程序就是這樣一個(gè)命令,證書管理比較復(fù)雜,在沒有很好的GUI 界面程序出現(xiàn)之前最好用如下的腳本來頒發(fā)證書。這個(gè)腳本首先會(huì)在當(dāng)前目錄下生成一個(gè)目錄ca.db.certs 。這個(gè)目錄用來保存發(fā)放的證書,文件名的形式為“系列號(hào).pem”。腳本還會(huì)生成一個(gè)ca.db.series 的文件,保存當(dāng)前頒發(fā)證書的系列號(hào)。生成的另外一個(gè)文件是ca.db.index ,這是一個(gè)索引文件,保存了系列號(hào)和證書的DN 名的映射。腳本接著生成一個(gè)配置文件,之后以配置文件、申請(qǐng)證書的請(qǐng)求為材料調(diào)用CA 程序生成用戶的證書。Openssl 提供的CA 程序?yàn)榘言瓉淼腸a.db.index 和ca.db.series 保存為相應(yīng)的.old 文件并生成新的文件,而且在ca.db.certs 目錄下保存了用戶證書的一個(gè)副本。最后腳本清除現(xiàn)場(chǎng)退出。 #!/bin/sh
##
## sign.sh -- Sign a SSL Certificate Request (CSR)
## Copyright (c) 1998-2001 Ralf S. Engelschall, All Rights Reserved.
##
# argument line handling
CSR=$1
if [ $# -ne 1 ]; then
echo "Usage: sign.sh
fi
if [ ! -f $CSR ]; then
echo "CSR not found: $CSR"; exit 1
fi
case $CSR in
*.csr ) CERT="`echo $CSR | sed -e ''s/.csr/.crt/''`" ;;
* ) CERT="$CSR.crt" ;;
esac
# make sure environment exists
if [ ! -d ca.db.certs ]; then
mkdir ca.db.certs
fi
if [ ! -f ca.db.serial ]; then
echo ''01'' >ca.db.serial
fi
if [ ! -f ca.db.index ]; then
cp /dev/null ca.db.index
fi
,# create an own SSLeay config
cat >ca.config < [ ca ] default_ca = CA_own [ CA_own ] dir = . certs = $dir new_certs_dir = $dir/ca.db.certs database = $dir/ca.db.index serial = $dir/ca.db.serial RANDFILE = $dir/ca.db.rand certificate = $dir/ca.crt private_key = $dir/ca.key default_days = 365 default_crl_days = 30 default_md = md5 preserve = no policy = policy_anything [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional EOT # sign the certificate echo "CA signing: $CSR -> $CERT:" openssl ca -config ca.config -out $CERT -infiles $CSR echo "CA verifying: $CERT <-> CA cert" openssl verify -CAfile ca.crt $CERT # cleanup after SSLeay rm -f ca.config rm -f ca.db.serial.old rm -f ca.db.index.old # die gracefully exit 0 用戶申請(qǐng)證書 1.先生成私鑰 使用下面的命令用戶可生成一個(gè)RSA 私鑰,用Triple-DES 加密, 密鑰的輸出格式為PEM ,指令執(zhí)行時(shí)會(huì)詢問日后訪問私鑰的口令。注意妥善保管好私鑰和訪問私鑰的口令: $ openssl genrsa -des3 -out tom.key 1024 用下面的指令可以查看私鑰內(nèi)容(需要提供私鑰訪問口令): $ openssl rsa -noout -text -in tom.key 你也可以生成一個(gè)不需要口令訪問的私鑰: $ openssl rsa -in tom.key -out tom.key.unsecure 2.用如上的私鑰生成一個(gè)證書簽名申請(qǐng)(CSR) : $ openssl req -new -key tom.key -out tom.csr 你需要提供識(shí)別全限定域名(FQDN ),比如: 有些內(nèi)容可以填寫,有些內(nèi)容可以不填,全限定名非常重要。人家信不信任你基本就靠它了。另外注意填寫E-mail 或電話之類的,證書頒發(fā)機(jī)構(gòu)便于與你聯(lián)系。當(dāng)然你也可以用下面的指令查看請(qǐng)求內(nèi)容: $ openssl req -noout -text -in tom.csr 證書簽名申請(qǐng),也可以使用其它的程序。一些需要使用證書的程序都有這個(gè)功能,比如微軟的IIS 服務(wù)器。 服務(wù)方頒發(fā)證書 當(dāng)服務(wù)方接到用戶的CSR 文件之后(CSR 文件的傳遞方式可以是E-mail 或網(wǎng)上提 交),可以用CSR 里的E-mail 或電話等聯(lián)系方式和用戶確認(rèn)信息。在決定頒發(fā)證書之后,執(zhí)行下面指令生成用戶證書: $ sign.sh tom.csr 生成的tom.crt 就是用戶證書。 用戶獲得證書 用戶獲得證書后,可以用內(nèi)容文字編輯器打開證書。Openssl 程序輸出的證書缺省為PEM 格式,證書的全部?jī)?nèi)容在“-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----”之間。注意不要修改“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”之間的任何部分,其它的內(nèi)容可以去掉。 對(duì)于那些不能識(shí)別PEM 格式證書的程序,可以用下面的指令生成DER 格式的證書: $ openssl x509 -in tom.crt -out cert.der -outform DER 用戶使用證書 1.?dāng)?shù)字簽名 smime 指令的-sign 參數(shù)用于對(duì)郵件進(jìn)行簽名: $openssl smime -sign -in my.txt -out my.sign -inkey tom.key -singer tom.crt 2.驗(yàn)證簽名 smime 指令的-verify 參數(shù)用于對(duì)郵件簽名進(jìn)行驗(yàn)證: $openssl smime -verify -in my.sign -out my.txt -ceritfile tom.crt -CAfile ca.crt 3.?dāng)?shù)字信封(加密) smime 指令的- encrypt參數(shù)用于對(duì)郵件進(jìn)行加密: $openssl smime -encrypt -in my.txt -out my.enc tom.crt 4.?dāng)?shù)字信封(解密) smime 指令的- encrypt參數(shù)用于對(duì)郵件進(jìn)行解密: $openssl smime -decrypt -in my.enc -out my.txt1 -inkey tom.key -recip tom.crt 5.簽名后加密 smime 指令的-sign 參數(shù)用于對(duì)郵件進(jìn)行簽名,接著smime 指令的- encrypt 參數(shù)用