前言
最近一直不是在做安全相關(guān)的東西嘛,簽名和加密都要用到秘鑰,當(dāng)時(shí)的秘鑰都是師兄給我的。自己還沒(méi)有生成過(guò),于是這里來(lái)學(xué)習(xí)OpenSSL。
互聯(lián)網(wǎng)的發(fā)展史上,安全性一直是開(kāi)發(fā)者們相當(dāng)重視的一個(gè)主題,為了實(shí)現(xiàn)數(shù)據(jù)傳輸安全,我們需要保證:數(shù)據(jù)來(lái)源(非偽造請(qǐng)求)、數(shù)據(jù)完整性(沒(méi)有被人修改過(guò))、數(shù)據(jù)私密性(密文,無(wú)法直接讀取)等。雖然現(xiàn)在已經(jīng)有SSL/TLS協(xié)議實(shí)現(xiàn)的HTTPS協(xié)議,但是因在客戶(hù)端上依賴(lài)瀏覽器的正確實(shí)現(xiàn),而且效率又很低,所以一般的敏感數(shù)據(jù)(如交易支付信息等)還是需要我們使用加密方法來(lái)手動(dòng)加密。
1、OpenSSL是什么?
OpenSSL是一個(gè)開(kāi)放源代碼的SSL協(xié)議的產(chǎn)品實(shí)現(xiàn),它采用C語(yǔ)言作為開(kāi)發(fā)語(yǔ)言,具備了跨系統(tǒng)的性能,支持Linux、Unix、Windows、Mac和VMS等多種平臺(tái)。(這玩意是一個(gè)軟件產(chǎn)品)
OpenSSL最早的版本在1995年發(fā)布,1998年后開(kāi)始由OpenSSL項(xiàng)目組維護(hù)和開(kāi)發(fā)。當(dāng)前最新的版本是0.9.7b版本,完全實(shí)現(xiàn)了對(duì)SSLv1、SSLv2、SSLv3和TLS的支持。目前,OpenSSL已經(jīng)得到了廣泛的應(yīng)用,許多類(lèi)型的軟件中的安全部分都使用了OpenSSL的庫(kù),如VOIP的OpenH323協(xié)議、Apache服務(wù)器、Linux安全模塊等等。
雖然OpenSSL使用SSL作為其名字的重要組成部分,但其實(shí)現(xiàn)的功能確遠(yuǎn)遠(yuǎn)超出了SSL協(xié)議本身。OpenSSL事實(shí)上包括了三部分:
-
SSL協(xié)議
-
密碼算法庫(kù)
-
應(yīng)用程序庫(kù)
-
1、SSL協(xié)議部分完全實(shí)現(xiàn)和封裝了SSL協(xié)議的三個(gè)版本和TLS協(xié)議,SSL協(xié)議庫(kù)的實(shí)現(xiàn)是在密碼算法庫(kù)的基礎(chǔ)上實(shí)現(xiàn)的。使用該庫(kù),你完全可以建立一個(gè)SSL服務(wù)器和SSL客戶(hù)端。
-
2、密碼算法庫(kù)是一個(gè)強(qiáng)大完整的密碼算法庫(kù),它是OpenSSL的基礎(chǔ)部分,也是很值得一般密碼安全技術(shù)人員研究的部分,它實(shí)現(xiàn)了目前大部分主流的密碼算法和標(biāo)準(zhǔn)。主要包括公開(kāi)密鑰算法、對(duì)稱(chēng)加密算法、散列函數(shù)算法、X509數(shù)字證書(shū)標(biāo)準(zhǔn)、PKCS12、PKCS7等標(biāo)準(zhǔn)。事實(shí)上,OpenSSL的SSL協(xié)議部分和應(yīng)用程序部分都是基于這個(gè)庫(kù)開(kāi)發(fā)的。
目前,這個(gè)庫(kù)除了可以使用本身的缺省算法外,在0.9.6版本之后,還提供了Engine機(jī)制,用于將如加密卡這樣外部的加密算法實(shí)現(xiàn)集成到OpenSSL中。 -
3、應(yīng)用程序部分是OpenSSL最生動(dòng)的部分,也是OpenSSL使用入門(mén)部分。該部分基于上述的密碼算法庫(kù)和SSL協(xié)議庫(kù)實(shí)現(xiàn)了很多實(shí)用和范例性的應(yīng)用程序,覆蓋了眾多的密碼學(xué)應(yīng)用。主要包括了各種算法的加密程序和各種類(lèi)型密鑰的產(chǎn)生程序(如RSA、Md5、Enc等等)、證書(shū)簽發(fā)和驗(yàn)證程序(如Ca、X509、Crl等)、SSL連接測(cè)試程序(如S_client和S_server等)以及其它的標(biāo)準(zhǔn)應(yīng)用程序(如Pkcs12和Smime等)。在某些時(shí)候,不需要做二次開(kāi)發(fā),僅僅使用這些應(yīng)用程序便能得到我們的應(yīng)用要求,比如采用Ca程序就能基本上實(shí)現(xiàn)一個(gè)小型的CA功能。(這就是我需要的,生成秘鑰)
那么在知道OpenSSL是什么玩意之后,你的目的是什么? 是想集成它的算法庫(kù),還是實(shí)現(xiàn)SSL服務(wù)器,還是使用它的應(yīng)用程序來(lái)實(shí)現(xiàn)你的目的。
那么無(wú)論是什么,下面我們來(lái)看看基于OpenSSL的應(yīng)用。
2、基于OpenSSL的應(yīng)用
基于OpenSSL指令的應(yīng)用
基于OpenSSL指令的應(yīng)用很容易,只要安裝好了OpenSSL,就可以開(kāi)始使用了。最簡(jiǎn)單的應(yīng)用就是使用Req、CA以及X509指令來(lái)簽發(fā)一個(gè)證書(shū)了,該證書(shū)可以用于各種目的,比如很多Apache服務(wù)器就是使用OpenSSL的指令生成的證書(shū)作為服務(wù)器證書(shū)。
基于OpenSSL加密庫(kù)和協(xié)議庫(kù)的應(yīng)用
基于OpenSSL函數(shù)庫(kù)的應(yīng)用相比與基于OpenSSL指令的應(yīng)用開(kāi)發(fā)的工作量會(huì)大很多,但這并不意味著其應(yīng)用會(huì)更少。事實(shí)上,基于OpenSSL的應(yīng)用大部分是這種方式的,這種方式使得開(kāi)發(fā)者能夠根據(jù)自己的需求靈活地進(jìn)行選擇,而不必受OpenSSL有限的指令的限制。
到這里那必須整兩個(gè)例子,這里我就不將基于庫(kù)的應(yīng)用進(jìn)行展開(kāi)講了,整個(gè)CA證書(shū)和秘鑰生成的例子。
3、OpenSSL的目錄內(nèi)容
4、兩個(gè)例子:CA證書(shū)與秘鑰生成
1-CA證書(shū)
CA的目錄結(jié)構(gòu)
-
certs目錄:存放的是有效的用戶(hù)證書(shū),里面的文件格式是.cert格式,每一個(gè)用戶(hù)對(duì)應(yīng)一個(gè)證書(shū)。這些證書(shū)已經(jīng)被CA簽名了,是有效的。證書(shū)的具體格式在后面會(huì)有敘述和實(shí)例。
-
Crl目錄:在這個(gè)目錄中存放的是證書(shū)撤銷(xiāo)列表,里面的文件格式是.crl格式。一個(gè).crl文件記錄了一段時(shí)期內(nèi)被撤銷(xiāo)的證書(shū)的序列號(hào)。所有這些撤銷(xiāo)列表合起來(lái)記錄了所有的被撤銷(xiāo)的用戶(hù)證書(shū)。證書(shū)撤銷(xiāo)列表的具體格式見(jiàn)后面的分析。
-
newcerts:在這個(gè)目錄中存放的是那些等待被CA簽名的用戶(hù)證書(shū),這些證書(shū)還是沒(méi)有被簽名的,暫時(shí)無(wú)效。不過(guò)這些用戶(hù)的申請(qǐng)信息已經(jīng)告知了CA系統(tǒng),系統(tǒng)管理員可以通過(guò)對(duì)這些信息的分析,決定是否對(duì)這個(gè)證書(shū)簽名,使其生效。
-
private:這個(gè)目錄中存放的是所有用戶(hù)包括CA的私鑰,里面的文件格式是.key格式的。每一個(gè)證書(shū)對(duì)應(yīng)一個(gè).key文件。這個(gè)目錄起到一個(gè)簡(jiǎn)單的密鑰歸檔作用。
1.1 創(chuàng)建CA的準(zhǔn)備工作
-
1、創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)( index.txt文件)
- 記錄根CA創(chuàng)建證書(shū)或者撤銷(xiāo)證書(shū)的事件;
- 每次創(chuàng)建或者撤銷(xiāo)證書(shū)事件發(fā)生時(shí),它是自動(dòng)更新的;
-
2、創(chuàng)建一個(gè)序列號(hào)(serial)文件
- 記錄下次即將創(chuàng)建的用戶(hù)證書(shū)的序列號(hào);
- 每次創(chuàng)建一個(gè)新證書(shū)時(shí),將其中的序列號(hào)賦給證書(shū);
- 證書(shū)創(chuàng)建完成后,自動(dòng)將序列號(hào)加1;
- 根證書(shū)的序列號(hào)默認(rèn)為00;
1.2 創(chuàng)建CA證書(shū)的基本步驟
- 1、在原來(lái)創(chuàng)建的. rnd文件中輸入一個(gè)數(shù)做為偽隨機(jī)數(shù)發(fā)生器的種子;
- 2、利用1中的種子和RSA算法為CA生成一個(gè)CA密鑰對(duì);
- 3、申請(qǐng)創(chuàng)建CA證書(shū),輸入系統(tǒng)要求的必要的注冊(cè)信息;系統(tǒng)會(huì)用2中生成的CA密鑰對(duì)對(duì)這個(gè)證書(shū)進(jìn)行自簽名;
- 4、安裝生成的CA證書(shū),即讓本機(jī)信任這個(gè)CA證書(shū);
1.3 生成CA密鑰對(duì)
命令:
genrsa -out private\ca.key -rand privatel\.rnd 2048
生成的密鑰對(duì)存放在ca.key中。
生成密鑰對(duì)命令的詳細(xì)解釋:
-
genrsa:用RSA算法產(chǎn)生(gen)密鑰對(duì);
-
-out privatelca.key:生成的密鑰對(duì)存放(-out)在private目錄下的ca.key文件中;
-
-rand privatel.rnd:在RSA算法中,偽隨機(jī)數(shù)產(chǎn)生器用的種子是放在private.rnd中的;里面的種子管理員可以手動(dòng)修改;
-
2048:表示生成的密鑰長(zhǎng)度是2048位的。
顯然,上面的.key文件是明文保存的,是很不安全的。而密鑰一旦泄漏,響應(yīng)的證書(shū)也就失效。所以CA提供了一個(gè)可選配置,通過(guò)配置,使得每次生成一個(gè)新的密鑰對(duì)的時(shí)候,必須用一個(gè)口令對(duì)響應(yīng)的.key文件進(jìn)行加密(加密算法是DES)。這在一定程度上提高了系統(tǒng)的可靠性。
1.4創(chuàng)建CA證書(shū)(自簽名)
命令格式:
C:\CARoot \ req -new -x509 - days 3650 -key private\ca.key -out private\ca.crt -config openssl.cnf
命令詳細(xì)解釋:
- req -new -x509:申請(qǐng)(req)一個(gè)新的(new)的x509證書(shū);
-
- days 3650:證書(shū)的有效期是3650天。一般CA證書(shū)的有效期較長(zhǎng),而用戶(hù)證書(shū)的有效期相對(duì)來(lái)說(shuō)較短;
- -key private \ca. key:對(duì)這個(gè)證書(shū)進(jìn)行簽名的CA密鑰存放在private\ca. key中(我們上一步產(chǎn)生CA密鑰對(duì)的時(shí)候就是放在這里的);
- -out private\ca.crt:生成的證書(shū)放在(-out)private目錄下,證書(shū)的名字是ca.crt;
- -config openssl.cnf:產(chǎn)生證書(shū)的時(shí)候采用的配置策略,里面可能包括證書(shū)的版本信息、擴(kuò)展信息等。
1.5 CA證書(shū)的詳細(xì)內(nèi)容
- 版本(V3)
- 序列號(hào)(00)
- 加密算法(RSA、MD5)
- 有效期(2005年5月24日至2015年5月22日)●公鑰
- 自簽名(2048位)●頒發(fā)者
- 證書(shū)申請(qǐng)者信息(注冊(cè)過(guò)程中的全部信息)
(還有個(gè)生成用戶(hù)證書(shū)的,這里就不展示了)
2-秘鑰生成
1. 生成私鑰
openssl genrsa -out ../mycerts/rsa_private_key.pem 2048 生成rsa私鑰,文本存儲(chǔ)格式,長(zhǎng)度2048
如果你想將PEM格式的私鑰文件rsa_private_key.pem轉(zhuǎn)成PEM格式的不加密的私鑰文件
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
2. 根據(jù)私鑰生成對(duì)應(yīng)的公鑰
openssl rsa -in ../mycerts/rsa_private_key.pem -pubout -out ../mycerts/rsa_public_key_2048.pub
3. 私鑰轉(zhuǎn)化成pkcs8格式
openssl pkcs8 -topk8 -inform PEM -in ../mycerts/rsa_private_key.pem outform PEM -nocrypt > ../mycerts/rsa_private_key_pkcs8.pem
生成的結(jié)果就是文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-723774.html
rsa_private_key.pem
rsa_public_key.pem
4、相關(guān)參數(shù)
genrsa命令相關(guān)參數(shù)
【genrsa】
-out filename:將生成的私鑰保存至filename文件,若未指定輸出文件,則為標(biāo)準(zhǔn)輸出。
numbits:指定要生成的私鑰的長(zhǎng)度,默認(rèn)為1024。該項(xiàng)必須為命令行的最后一項(xiàng)參數(shù)。
-des:生成的密鑰使用des方式進(jìn)行加密。
-des3:生成的密鑰使用des3方式進(jìn)行加密。
-passout args:加密私鑰文件時(shí),傳遞密碼的格式,如果要加密私鑰文件時(shí)單未指定該項(xiàng),則提示輸入密碼。傳遞密碼的args的格式,可從密碼、環(huán)境變量、文件、終端等輸入。
a.pass:password:password表示傳遞的明文密碼
b.env:var:從環(huán)境變量var獲取密碼值
c.file:filename:filename文件中的第一行為要傳遞的密碼。若filename同時(shí)傳遞給"-passin"和"-passout"選項(xiàng),則filename的第一行為"-passin"的值,第二行為"-passout"的值
d.stdin:從標(biāo)準(zhǔn)輸入中獲取要傳遞的密碼
pkcs8相關(guān)參數(shù)
【pkcs8】
-inform PEM|DER::輸入文件格式,DER或者PEM格式。DER格式采用ASN1的DER標(biāo)準(zhǔn)格式。一般用的多的都是PEM格式,就是base64編碼格式。
-outform DER|PEM:輸出文件格式,DER或者PEM格式。
-in filename:輸入的密鑰文件,默認(rèn)為標(biāo)準(zhǔn)輸入。如果密鑰被加密,會(huì)提示輸入一個(gè)密鑰口令。
-passin arg:輸入文件口令保護(hù)來(lái)源。
-out filename:輸出文件,默認(rèn)為標(biāo)準(zhǔn)輸出。如果任何加密操作已經(jīng)執(zhí)行,會(huì)提示輸入一個(gè)密鑰值。輸出的文件名字不能和輸入的文件名一樣。
-passout arg:輸出文件口令保護(hù)來(lái)源。
-topk8:通常的是輸入一個(gè)pkcs8文件和傳統(tǒng)的格式私鑰文件將會(huì)被寫(xiě)出。設(shè)置了此選項(xiàng)后,位置轉(zhuǎn)換過(guò)來(lái):輸入一個(gè)傳統(tǒng)格式的私鑰文件,輸出一個(gè)PKCS#8格式的文件。
-noiter:MAC保護(hù)計(jì)算次數(shù)為1。
-nocrypt:PKCS#8密鑰產(chǎn)生或輸入一般用一個(gè)適當(dāng)?shù)孛荑€來(lái)加密PKCS#8 EncryptedPrivateKeyInfo結(jié)構(gòu)。設(shè)置了此選項(xiàng)后,一個(gè)不加密的PrivateKeyInfo結(jié)構(gòu)將會(huì)被輸出。這個(gè)選項(xiàng)一直不加密私鑰文件,在絕對(duì)必要的時(shí)候才能夠使用。某些軟件例如一些JAVA代碼簽名軟件使用不加密的私鑰文件。
-nooct:這個(gè)選項(xiàng)產(chǎn)生的RSA私鑰文件是一個(gè)壞的格式,一些軟件將會(huì)使用。特別的是,私鑰文件必須附上一個(gè)八位組字符串,但是一些軟件僅僅包含本身的結(jié)構(gòu)體沒(méi)有使八位組字符串所環(huán)繞。不采用八位組表示私鑰。
-embed:這個(gè)選項(xiàng)產(chǎn)生的RSA私鑰文件是一個(gè)壞的格式。在私鑰結(jié)構(gòu)體中采用嵌入式DSA參數(shù)格式。在這個(gè)表單中,八位組字符串包含了ASN1 SEQUENCE中的兩種結(jié)構(gòu):一個(gè)SEQUENCE包含了密鑰參數(shù),一個(gè)ASN1 INTEGER包含私鑰值。
-nsdb:這個(gè)選項(xiàng)產(chǎn)生的RSA私鑰文件是一個(gè)壞的格式并兼容了Netscape私鑰文件數(shù)據(jù)庫(kù)。采用NetscapeDB的DSA格式。
-v2 alg:采用PKCS#5 v2.0,并指定加密算法,默認(rèn)的是PKCS#8私鑰文件被叫做B<pbeWithMD5AndDES-CBC>(該算法用56字節(jié)的DES加密但是在PKCS#5 v1.5中有更加強(qiáng)壯的加密算法)的加密算法用口令進(jìn)行加密。用B<-v2>選項(xiàng),PKCS#5 v2.0相關(guān)的算法將會(huì)被使用,可以是des3(168字節(jié))和rc2(128字節(jié)),推薦des3。
-v1 alg:采用PKCS#5 v1.5或pkcs12,并指定加密算法??刹捎玫乃惴ㄒ?jiàn)下面。
rsa相關(guān)參數(shù)
【rsa】
-inform PEM|NET|DER:輸入文件格式,DER、PEM以及NET格式。DER格式采用ASN1的DER標(biāo)準(zhǔn)格式。一般用的多的都是PEM格式,就是base64編碼格式。NET是為了和老的netscape server以及IIS兼容才弄出來(lái)的。他使用沒(méi)有被salt過(guò)的RC4做加密算法,加密強(qiáng)度很底,如果不是一定要用就別用。
-outform PEM|NET|DER:輸出文件格式,DER、PEM以及NET格式。同inform。
-in filename:輸入的RSA密鑰文件,默認(rèn)為標(biāo)準(zhǔn)輸入。
-out filename:RSA密鑰輸出文件,默認(rèn)為標(biāo)準(zhǔn)輸出。
-passin arg:指定私鑰包含口令存放方式。比如用戶(hù)將私鑰的保護(hù)口令寫(xiě)入一個(gè)文件,采用此選項(xiàng)指定此文件,可以免去用戶(hù)輸入口令的操作。比如用戶(hù)將口令寫(xiě)入文件“pwd.txt”,輸入的參數(shù)為:-passin file:pwd.txt。
-passout arg:輸出文件口令保護(hù)存放方式。
-sgckey:該選項(xiàng)是配合NET格式的私有密鑰文件的一個(gè)選項(xiàng)。
-text:打印所有信息。
-noout:不打印信息。
-modulus:打印公鑰信息。
-check:檢查公司約是否匹配。
-pubin:設(shè)置此選項(xiàng)后,從輸入文件中讀取公鑰值,默認(rèn)讀取的是私鑰值。
-pubout:設(shè)置此選項(xiàng)后,保存公鑰值到輸出文件中,默認(rèn)的是保存私鑰值到輸出文件中。
-engine id:指定引擎。
? -des ,-des3, -idea, -aes128, -aes192, -aes256,-camellia128, -camellia192, -camellia256:指定的私鑰保護(hù)加密算法。
參考鏈接:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-723774.html
- 1、https://wenku.baidu.com/view/6a274407cc175527072208df?fr=text_ernie_recall%3Awk_recommend_main3-TopList_highScoreList-pcview_toplistrec_highscore_wk_recommend_main3-0e8f642dbd64783e09122b34&wkts=1675865285087&bdQuery=OpenSSL%E4%BD%BF%E7%94%A8
- 2、https://wenku.baidu.com/view/0e8f642dbd64783e09122b34.html?fr=aladdin664466&ind=1&wkts=1675864390660&bdQuery=OpenSSL%E4%BD%BF%E7%94%A8
- 3、https://blog.csdn.net/my_miuye/article/details/123151834
到了這里,關(guān)于淺淺學(xué)習(xí)一下OpenSSL的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!