概述
- 繁多復雜的各種文件編碼格式、證書格式和密鑰格式等。事實上,并非OpenSSL開發者想要將數字世界弄得如此令人頭疼,只是由于各種原因,數字世界存在各種不同的標準,為了盡量兼容這些不同的標準,OpenSSL開發者才相應地在其指令和代碼中支持如此多的格式。
- 日常使用會面臨處理這些不同標準之間相互兼容和轉換的問題,比如將X.509證書轉換成PKCS#12格式證書就是常見的任務。事實上,在OpenSSL的很多指令中提供了不同格式和標準之間的轉換功能
- 本章將集中介紹pkcs8和nseq指令的使用及其相關的標準
PKCS#8標準簡介
- 相對于其他標準,PKCS#8標準算是一個非常簡單的標準了,它主要用于封裝私鑰和其他相關的屬性信息。一般來說,PKCS#8格式的私鑰都是被加密的,支持PKCS#5和PKCS#12標準定義的算法,當然,私鑰也可以不加密。
- PKCS#8標準一方面可以增強私鑰的安全性,另一方面也為用戶提供了一種簡單的確立信任關系的方式,這主要是基于私鑰特別名稱和最高層可信者的權威公鑰等屬性信息。
pkcs8指令介紹
功能概述和指令格式
- OpenSSL提供了pkcs8指令來執行PKCS#8標準相關的工作。它可以把私鑰轉化為PKCS#8的格式,也可以把PKCS#8格式的私鑰轉換成其他存儲標準的格式。OpenSSL的pkcs8指令對加密和非加密格式的私鑰都能進行處理,其支持的加密算法有PKCS#5(版本1.5和2.0)和PKCS#12兩種標準的定義。OpenSSL提供的經過PEM編碼的PKCS#8標準的文件,分為加密和非加密兩種方式。
PKCS#8文件生成選項topk8
- 默認情況下,pkcs8指令會要求輸入一個PKCS#8格式的密鑰,并將其進行處理后轉換成普通格式的密鑰輸出并存儲,這種情況一般用于處理或者顯示一個已經存在的PKCS#8密鑰的內容。如果使用了topk8選項,則pkcs8指令會將輸入的一個普通格式的密鑰轉換成PKCS#8標準封裝的密鑰并輸出。
輸入輸出選項in,out,inform和outform
- in選項指定了輸入密鑰的文件名,默認情況下使用標準輸入。如果輸入的密鑰是經過加密的,那么在讀取密鑰信息的過程中會提示輸入加密口令。當然,如果你已經使用passin選項提供了加密口令,該提示信息就不會再出現。
- out選項指定了存儲輸出密鑰信息的文件名,默認情況下是標準輸出。如果選擇了加密選項而又沒有使用pasout選項指定加密口令時,在輸出密鑰時會提示輸入加密口令。輸出文件與輸入文件在同一個文件夾下時不可以重名,否則生成的文件會在沒有讀原密鑰文件之前覆蓋原文件,出現讀密鑰錯誤。
- inform和outform選項分別指定了輸入和輸出文件的編碼格式,支持的格式包括PEM和DER兩種。?
加密口令輸入選項passin和passout
- 由于私鑰的重要性,所以一般都使用了加密保護,加密保護使用的密鑰和初始向量是從用戶提供的口令中提取出來的,所以在使用密鑰的時候也需要提供相同的口令進行密鑰的解密。
- passin和passout選項分別指定了輸入和輸出密鑰時進行加解密的口令源。
- 如果輸入的密鑰文件需要口令進行解密而卻沒有使用pasin選項提供口令,那么程序會在指令行提示用戶輸入解密口令。
私鑰格式選項nocrypt,nooct,embed和nsdb
- 使用pkcs8指令時,通常情況下輸入或是產生的PKCS#8格式的密鑰都是使用口令基于某種算法加密的私鑰信息結構。
- 如果使用nocrypt選項,則告訴指令其輸入和產生的私鑰都將是不經加密的私鑰信息結構。私鑰不進行加密,顯然安全性會大大降低,所以除非萬不得已,一般不推薦使用此選項。
- nooct選項用于產生一種非標準格式的RSA私鑰,以兼容一些軟件。RSA私鑰一般明確要求被封裝到一個OCTETSTRING字符串內。但是有些軟件只能識別私鑰自身,對附加的OCTETSTRING字符串不能識別。在這種情況下,就可以使用nooct選項去掉OCTETSTRING字符串。
- embed選項用于產生一種非標準格式的DSA密鑰。在這種格式中,DSA參數內嵌到PrivateKey結構中。
- nsdb選項則用于產生一種兼容Netscape私鑰數據庫格式的DSA密鑰。
密鑰加密算法選項v2和v1
- v1選項用于選擇PKCS#5v20中的所有算法。一般情況下,PKCS#8結構的私鑰是使用pbeWithMD5AndDES-CBC這種口令加密算法加密的。雖然這種算法只使用了56bit的DES加密,但已經是PKCS#5v1.5中加密強度最高的算法。
- 使用v2選項則可以選擇PKCS#5v2.0中更高強度的算法,這些算法有168bit的3DES或者128bit的RC2等。目前的軟件支持PKCS#5v2.0的不多,但是如果你使用的范圍都局限于OpenSSL,那么就一點問題都沒有。
- v2選項有效的參數包括des,des3和rc2,OpenSSL推薦讀者使用DES3這種加密算法。v1選項用于選擇PKCS#5v1.5或者PKCS#12中定義的算法,事實上,也包含了部分PKCS#5v2.0中定義的算法。
- 表11-1列出了v1選項可以使用的參數及其含義。
engine選項
- 如果engine選項指定了有效的Engine設備,那么指令中任何該Engine設備支持的上述操作都會使用Engine設備的操作流程而不再使用OpenSSL算法庫本身提供的函數。
- 對于pkcs8指令來說,可以使用engine設備的操作主要包括RSA或者DSA密鑰產生和對私鑰進行加解密的算法。?
例子
?Netscape證書標準
- 為了方便下載一系列的證書,尤其對于為了驗證要下載一個證書鏈的情況,Netscape提供了一種名為Netscape證書序列(Netscape? Certificate? Sequence)的格式來封裝一系列證書(事實上,里面采用了一個PKCS#7格式來封裝證書),以便能夠一次性地下載或者傳輸多個數字證書。
- 所以,某些時候,Netscape證書序列可以替代PKCS#7的作用,用來打包一系列證書。Netscape證書序列雖然不一定能夠得到微軟的支持,但是在其他一些開源軟件和Linux軟件中卻得到了廣泛的支持,我們也因此隨時會面臨要把普通的一些證書封裝成Netscape證書序列的要求和任務。
- OpenSSL顯然也考慮到了這些可能出現的問題,于是提供了本節要介紹的nseq指令。
功能概述和指令格式
- nseq指令的任務簡單而明確:將普通X.509證書封裝成Netscape證書序列,或者將Netscape證書序列轉換成普通的X.509證書。
- 這個指令的格式簡單,也容易掌握,其格式為:
輸入和輸出文件選項in和out
- in和out選項分別指定了輸入和輸出的文件名,默認是標準的輸入和輸出設備。
轉化格式選項toseq
- 使用toseq選項告訴指令執行將一個或者多個普通X.509證書轉換成一個Netscape證書序列的操作。如果不使用該選項,即默認情況下,輸入的應該是一個Netscape證書序列文件,而輸出的是一個或者多個普通X.509證書,當然,它們都存儲在一個輸出文件中。?