[原]SSL 开发简述(Delphi)
一、??????????? 簡(jiǎn)介
現(xiàn)在網(wǎng)上有關(guān)SSL的資料較多的是基于VC開(kāi)發(fā),Delphi的SSL開(kāi)發(fā)資源很少。
本文主要使用OpenSSL為基礎(chǔ),講述SSL的有關(guān)開(kāi)發(fā)流程。OpenSSL功能非常豐富,具體可以去她的官方網(wǎng)看看??上](méi)有中文說(shuō)明。
OpenSSL:http://www.openssl.org/
一.1、?????????? SSL協(xié)議是什么
SSL 是一個(gè)縮寫(xiě),代表的是 Secure Sockets Layer。它是支持在 Internet 上進(jìn)行安全通信的標(biāo)準(zhǔn),并且將數(shù)據(jù)密碼術(shù)集成到了協(xié)議之中。數(shù)據(jù)在離開(kāi)您的計(jì)算機(jī)之前就已經(jīng)被加密,然后只有到達(dá)它預(yù)定的目標(biāo)后才被解密。證書(shū)和密碼學(xué)算法支持了這一切的運(yùn)轉(zhuǎn),使用 OpenSSL,您將有機(jī)會(huì)切身體會(huì)它們。
理論上,如果加密的數(shù)據(jù)在到達(dá)目標(biāo)之前被截取或竊聽(tīng),那些數(shù)據(jù)是不可能被破解的。不過(guò),由于計(jì)算機(jī)的變化一年比一年快,而且密碼翻譯方法有了新的發(fā)展,因此,SSL 中使用的加密協(xié)議被破解的可能性也在增大。
可以將 SSL 和安全連接用于 Internet 上任何類(lèi)型的協(xié)議,不管是 HTTP、POP3,還是 FTP。還可以用 SSL 來(lái)保護(hù) Telnet 會(huì)話(huà)。雖然可以用 SSL 保護(hù)任何連接,但是不必對(duì)每一類(lèi)連接都使用 SSL。如果連接傳輸敏感信息,則應(yīng)使用 SSL。
一.2、?????????? 什么是 OpenSSL?
OpenSSL 不僅僅是 SSL。它可以實(shí)現(xiàn)消息摘要、文件的加密和解密、數(shù)字證書(shū)、數(shù)字簽名和隨機(jī)數(shù)字。關(guān)于 OpenSSL 庫(kù)的內(nèi)容非常多,遠(yuǎn)不是一篇文章可以容納的。
OpenSSL 不只是 API,它還是一個(gè)命令行工具。命令行工具可以完成與 API 同樣的工作,而且更進(jìn)一步,可以測(cè)試 SSL 服務(wù)器和客戶(hù)機(jī)。它還讓開(kāi)發(fā)人員對(duì) OpenSSL 的能力有一個(gè)認(rèn)識(shí)。
二、??????????? CA概念描述
CA是證書(shū)的簽發(fā)機(jī)構(gòu),它是PKI的核心。CA是負(fù)責(zé)簽發(fā)證書(shū)、認(rèn)證證書(shū)、管理已頒發(fā)證書(shū)的機(jī)關(guān)。它要制定政策和具體步驟來(lái)驗(yàn)證、識(shí)別用戶(hù)身份,并對(duì)用戶(hù)證書(shū)進(jìn)行簽名,以確保證書(shū)持有者的身份和公鑰的擁有權(quán)。
CA 也擁有一個(gè)證書(shū)(內(nèi)含公鑰)和私鑰。網(wǎng)上的公眾用戶(hù)通過(guò)驗(yàn)證 CA 的簽字從而信任 CA ,任何人都可以得到 CA 的證書(shū)(含公鑰),用以驗(yàn)證它所簽發(fā)的證書(shū)。
如果用戶(hù)想得到一份屬于自己的證書(shū),他應(yīng)先向 CA 提出申請(qǐng)。在 CA 判明申請(qǐng)者的身份后,便為他分配一個(gè)公鑰,并且 CA 將該公鑰與申請(qǐng)者的身份信息綁在一起,并為之簽字后,便形成證書(shū)發(fā)給申請(qǐng)者。
如果一個(gè)用戶(hù)想鑒別另一個(gè)證書(shū)的真?zhèn)?#xff0c;他就用 CA 的公鑰對(duì)那個(gè)證書(shū)上的簽字進(jìn)行驗(yàn)證,一旦驗(yàn)證通過(guò),該證書(shū)就被認(rèn)為是有效的。
二.1、?????????? 證書(shū)
證書(shū)實(shí)際是由證書(shū)簽證機(jī)關(guān)(CA)簽發(fā)的對(duì)用戶(hù)的公鑰的認(rèn)證。
證書(shū)的內(nèi)容包括:電子簽證機(jī)關(guān)的信息、公鑰用戶(hù)信息、公鑰、權(quán)威機(jī)構(gòu)的簽字和有效期等等。目前,證書(shū)的格式和驗(yàn)證方法普遍遵循X。509 國(guó)際標(biāo)準(zhǔn)。
如何在電子文檔上實(shí)現(xiàn)簽名的目的呢?我們可以使用數(shù)字簽名。RSA公鑰體制可實(shí)現(xiàn)對(duì)數(shù)字信息的數(shù)字簽名,方法如下:
信息發(fā)送者用其私鑰對(duì)從所傳報(bào)文中提取出的特征數(shù)據(jù)(或稱(chēng)數(shù)字指紋)進(jìn)行RSA算法操作,以保證發(fā)信人無(wú)法抵賴(lài)曾發(fā)過(guò)該信息(即不可抵賴(lài)性),同時(shí)也確保信息報(bào)文在傳遞過(guò)程中未被篡改(即完整性)。當(dāng)信息接收者收到報(bào)文后,就可以用發(fā)送者的公鑰對(duì)數(shù)字簽名進(jìn)行驗(yàn)證。
在數(shù)字簽名中有重要作用的數(shù)字指紋是通過(guò)一類(lèi)特殊的散列函數(shù)(HASH函數(shù)) 生成的。對(duì)這些HASH函數(shù)的特殊要求是:
1.接受的輸入報(bào)文數(shù)據(jù)沒(méi)有長(zhǎng)度限制;
2.對(duì)任何輸入報(bào)文數(shù)據(jù)生成固定長(zhǎng)度的摘要(數(shù)字指紋)輸出;
3.從報(bào)文能方便地算出摘要;
4.難以對(duì)指定的摘要生成一個(gè)報(bào)文,而由該報(bào)文可以算出該指定的摘要;
5.難以生成兩個(gè)不同的報(bào)文具有相同的摘要。
驗(yàn)證:
收方在收到信息后用如下的步驟驗(yàn)證您的簽名:
1.使用自己的私鑰將信息轉(zhuǎn)為明文;
2.使用發(fā)信方的公鑰從數(shù)字簽名部分得到原摘要;
3.收方對(duì)您所發(fā)送的源信息進(jìn)行hash運(yùn)算,也產(chǎn)生一個(gè)摘要;
4.收方比較兩個(gè)摘要,如果兩者相同,則可以證明信息簽名者的身份。
如果兩摘要內(nèi)容不符,會(huì)說(shuō)明什么原因呢?
可能對(duì)摘要進(jìn)行簽名所用的私鑰不是簽名者的私鑰,這就表明信息的簽名者不可信;也可能收到的信息根本就不是簽名者發(fā)送的信息,信息在傳輸過(guò)程中已經(jīng)遭到破壞或篡改。
二.2、?????????? 數(shù)字證書(shū)
數(shù)字證書(shū)為實(shí)現(xiàn)雙方安全通信提供了電子認(rèn)證。在因特網(wǎng)、公司內(nèi)部網(wǎng)或外部網(wǎng)中,使用數(shù)字證書(shū)實(shí)現(xiàn)身份識(shí)別和電子信息加密。數(shù)字證書(shū)中含有密鑰對(duì)(公鑰和私鑰)所有者的識(shí)別信息,通過(guò)驗(yàn)證識(shí)別信息的真?zhèn)螌?shí)現(xiàn)對(duì)證書(shū)持有者身份的認(rèn)證。
二.3、?????????? 使用數(shù)字證書(shū)能做什么?
數(shù)字證書(shū)在用戶(hù)公鑰后附加了用戶(hù)信息及CA的簽名。公鑰是密鑰對(duì)的一部分,另一部分是私鑰。公鑰公之于眾,誰(shuí)都可以使用。私鑰只有自己知道。由公鑰加密的信息只能由與之相對(duì)應(yīng)的私鑰解密。為確保只有某個(gè)人才能閱讀自己的信件,發(fā)送者要用收件人的公鑰加密信件;收件人便可用自己的私鑰解密信件。同樣,為證實(shí)發(fā)件人的身份,發(fā)送者要用自己的私鑰對(duì)信件進(jìn)行簽名;收件人可使用發(fā)送者的公鑰對(duì)簽名進(jìn)行驗(yàn)證,以確認(rèn)發(fā)送者的身份。
在線(xiàn)交易中您可使用數(shù)字證書(shū)驗(yàn)證對(duì)方身份。用數(shù)字證書(shū)加密信息,可以確保只有接收者才能解密、閱讀原文,信息在傳遞過(guò)程中的保密性和完整性。有了數(shù)字證書(shū)網(wǎng)上安全才得以實(shí)現(xiàn),電子郵件、在線(xiàn)交易和信用卡購(gòu)物的安全才能得到保證。
二.4、?????????? 認(rèn)證、數(shù)字證書(shū)和PKI解決的幾個(gè)問(wèn)題
l???????? 保密性 - 只有收件人才能閱讀信息。
l???????? 認(rèn)證性 - 確認(rèn)信息發(fā)送者的身份。
l???????? 完整性 - 信息在傳遞過(guò)程中不會(huì)被篡改。
l???????? 不可抵賴(lài)性 - 發(fā)送者不能否認(rèn)已發(fā)送的信息。
三、??????????? 搭建SSL工作流程
(搭建OpenSSL)
|
|
(根證書(shū)獲取方法圖)
四、??????????? 開(kāi)發(fā)
四.1、?????????? 編譯OpenSSL
四.1.1、??? 搭建準(zhǔn)備工作
1、?OpenSSL源代碼,可以直接到官網(wǎng)下載最新代碼。
2、?標(biāo)準(zhǔn)C編譯器(可以用VC,這里使用的是VC),編譯動(dòng)態(tài)庫(kù)。
3、?Perl5編譯環(huán)境,OpenSSL編譯需要Perl環(huán)境。官網(wǎng)有的下。
四.1.2、??? 編譯動(dòng)態(tài)庫(kù)
OpenSSL源代碼庫(kù)路徑: c:"opensslsource
1、?進(jìn)入VC命令行編譯環(huán)境
2、?進(jìn)入OpenSSL源代碼目錄:?cd c:"opensslsource
3、?執(zhí)行configure: perl Configure VC-WIN32 --prefix=c:/openssl
4、?創(chuàng)建Makefile文件:?ms"do_ms
5、?編譯動(dòng)態(tài)庫(kù):nmake –f ms"ntdll.mak
6、?測(cè)試動(dòng)態(tài)庫(kù):nmake –f ms"ntdll.mak test
7、?安裝動(dòng)態(tài)庫(kù):nmake –f ms"ntdll.mak install
8、?清除零時(shí)文件,以后便于重新編譯: nmake –f ms"ntdll.mak clean
說(shuō)明:要生成VC的靜態(tài)庫(kù)只要編譯 ms"nt.mak 的make文件。
四.2、?????????? 生成證書(shū)
由于OpenSSL的命令繁多,這里不詳細(xì)說(shuō)明。具體可以看:BBS水木清華站(FriNov1020:24:102000) fordesign@21cn.com翻譯的內(nèi)容。已經(jīng)整理成文檔放在目錄中。
四.2.1、??? 生成服務(wù)器端的私鑰(key文件)
openssl genrsa -des3 -out server。key 1024
運(yùn)行時(shí)會(huì)提示輸入密碼,此密碼用于加密key文件(參數(shù)des3便是指加密算法,當(dāng)然也可以選用其他你認(rèn)為安全的算法。),以后每當(dāng)需讀取此文件(通過(guò)openssl提供的命令或API)都需輸入口令。如果覺(jué)得不方便,也可以去除這個(gè)口令,但一定要采取其他的保護(hù)措施!
去除key文件口令的命令:
openssl rsa -in server.key -out server.key
四.2.2、??? 生成證書(shū)請(qǐng)求
openssl req -new -key server.key -out server.csr -config openssl.cnf
生成Certificate Signing Request(CSR),生成的csr文件交給CA簽名后形成服務(wù)端自己的證書(shū)。屏幕上將有提示,依照其指示一步一步輸入要求的個(gè)人信息即可。
四.2.3、??? 生成客戶(hù)key及csr文件
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cnf
四.2.4、??? CA證書(shū)簽證
CSR文件必須有CA的簽名才可形成證書(shū),可將此文件發(fā)送到verisign等地方由它驗(yàn)證。CA驗(yàn)證需要服務(wù)費(fèi),做測(cè)試使用可以自己生成。
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
四.2.5、??? 生成簽證文件
用生成的CA的證書(shū)為剛才生成的server。csr,client。csr文件簽名:
Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
四.2.6、??? 合成pem文件
Pem文件是 X.509 PAM 編碼(Base64)文件,是個(gè)文本文件??梢允褂?/span>x.509命令進(jìn)行合成,或直接拷貝粘貼。
上面生成的server文件和client文件合并成2個(gè)pem文件。
server使用的文件有:ca.crt,server.crt,server.key
client使用的文件有:ca.crt,client.crt,client.key
把 .crt文件和.key文件合并到同一個(gè)文件.pem文件。
四.3、?????????? Delphi接入
上面生成OpenSSL動(dòng)態(tài)庫(kù)我們現(xiàn)行可以直接加載使用。另外Indy組件封裝了OpenSSL的功能模塊,可以引用uIdSSLOpenSSLHeaders.pas單元文進(jìn)行開(kāi)發(fā)。
直接加載動(dòng)態(tài)庫(kù)開(kāi)發(fā)比較煩瑣,所以我們直接適用Indy提供的單元開(kāi)發(fā)。Indy單元文件實(shí)現(xiàn)的版本比較老,因此新DLL加載會(huì)發(fā)生錯(cuò)誤。在網(wǎng)上找到一個(gè)支持 0.9.7i OpenSSL較新動(dòng)態(tài)庫(kù)的Indy單元文件。
具體的開(kāi)發(fā)應(yīng)用可以看Source中的代碼。
四.3.1、??? 服務(wù)器端調(diào)用流程
四.3.2、??? 客戶(hù)段調(diào)用流程
轉(zhuǎn)載于:https://www.cnblogs.com/gleam/archive/2008/05/09/1190205.html
總結(jié)
以上是生活随笔為你收集整理的[原]SSL 开发简述(Delphi)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 求共开头的成语接龙!
- 下一篇: 你是我的谁是哪首歌啊?