OpenSSL命令—pkcs12
PKCS#12檔案在建立或分析的時候要依賴有一些選項。預設的是分析一個PKCS#12檔案。一個PKCS#12檔案可以用B<-export>選項來建立。
分析選項:
-in filename:指定私鑰和證書讀取的檔案,預設為標準輸入。必須為PEM格式。
-out filename:指定輸出的pkcs12檔案,預設為標準輸出。
-password arg:指定匯入匯出口令來源。
-passin arg:輸入檔案保護口令來源。
-passout arg:指定所有輸出私鑰保護口令來源。
-noout:不列印引數編碼的版本資訊。
-clcerts:僅僅輸出客戶端證書,不輸出CA證書。
-cacerts:僅僅輸出CA證書,不輸出客戶端證書。
-nocerts:不輸出任何證書。
-nokeys:不輸出任何私鑰資訊值。
-info:輸出PKCS#12檔案結構的附加資訊值。例如用的演算法資訊以及迭代次數。
-des:在輸出之前用DES演算法加密私鑰值。
-des3:在輸出之前用3DES演算法加密私鑰值。此項為預設。
-idea:在輸出之前用IDEA演算法加密私鑰值。
-aes128、-aes192、-aes256:在輸出之前用AES演算法加密私鑰值。
-camellia128、-camellia192、-camellia256:在輸出之前用camellia演算法加密私鑰值。
-nodes:一直對私鑰不加密。
-nomacver:讀取檔案時不驗證MAC值的完整性。
-twopass:需要使用者分別指定MAC口令和加密口令。
檔案建立選項:
-export:這個選項指定了一個PKCS#12檔案將會被建立。
-in filename:指定私鑰和證書讀取的檔案,預設為標準輸入。必須為PEM格式。
-out filename:指定輸出的pkcs12檔案,預設為標準輸出。
-inkey filename:指定私鑰檔案的位置。如果沒有被指定,私鑰必須在-in filename中指定。
-name name:指定證書以及私鑰的友好名字。當用軟體匯入這個檔案時,這個名字將被顯示出來。
-certfilefilename:新增filename中所有的證書資訊值。
-caname name:指定其它證書的友好名字。這個選項可以被用於多次。
-password arg:指定匯入匯出口令來源。
-passin arg:輸入檔案保護口令來源。
-passout arg:指定所有輸出私鑰保護口令來源。
-chain:如果這個選項被提出,則新增使用者證書的證書鏈。標準CA中心用它來搜尋。如果搜尋失敗,則是一個重大的錯誤。
-descert:用3DES對PKCS12進行加密,這樣楊浦可能會導致PKCS12檔案被一些“export grade”軟體不能夠讀取。預設的是用3DES對私鑰檔案進行加密,用40位的RC2對證書公鑰檔案進行加密。
-certpbealg:該選項允許指定證書的加密演算法。任何PKCS#5 v1.5或 PKCS#12 PBE型別的演算法都可以被使用。預設使用的是40位的RC2。
-keypbe alg:該選項允許指定證書私鑰的加密演算法。任何PKCS#5 v1.5或 PKCS#12 PBE型別的演算法都可以被使用。預設使用的是3DES。
-keyex:設定私鑰僅僅被用於金鑰交換。
-keysig:設定私鑰僅僅被用於數字簽名。
-macalg digest:指定MAC摘要演算法。如果沒有被指定,則預設使用sha1。
-nomaciter、-noiter:這個選項影響MAC值和金鑰演算法的迭代次數。除非你希望產生的檔案能與MSIE 4.0相相容,可以把這兩個選項丟棄一邊。
-maciter:加強完整性保護,多次計算MAC。
-nomac:不去規定MAC值的完整性。
-rand file(s):指定隨機數種子檔案,多個檔案間用分隔符分開,windows用“;”,OpenVMS用“,“,其他系統用“:”。
-CApatharg:指定CA目錄。該目錄必須是一個標準證書目錄:每個CA檔案的檔名為XXXX.0,XXXX為其持有者摘要值。
-CAfile arg:指定CA檔案。
-LMK:新增本地的機械屬性到私鑰中。
-CSP name:微軟的CSP的名字。
-engine id:指定硬體引擎。
注意:
有一大部分選項將不會使用。對PKCS#12檔案來說,僅僅B<-in>和 B<-out>需要被使用。對檔案建立來說,B<-export>和 B<-name>使用。
如果B<-clcerts>、B<-cacerts>或 B<-nocerts>沒有存在,所有的證書將會被依附到PKCS#12檔案將會被輸出。沒有保證的是提出的第一個證書不一定匹配私鑰。某些軟體需要一個私鑰和證書,來承擔在檔案中的第一個證書匹配私鑰:經常沒有這種情況。用B<-clcerts>選項能夠解決問題,因為這個選項要輸出與私鑰檔案相匹配的證書。如果CA證書是必需的,用B<-nokeys -cacerts>選項來輸出檔案,僅僅輸出CA證書。
B<-keypbe> 和 B<-certpbe>演算法允許明確的私鑰加密演算法和證書的詳細說明。通常的預設是好的,但是偶爾的軟體不能夠處理經過3DES加密了的私鑰。選項B<-keypbe PBE-SHA1-RC2-40>可以被用於減少40位元組的RC2私鑰加密。一個完整的所有演算法的描述包含在B手冊中。
例項:
分析一個PKCS#12檔案和輸出到檔案中:
openssl pkcs12 -in file.p12 -out file.pem
僅僅輸出客戶端證書到檔案中:
openssl pkcs12 -in file.p12 -clcerts -out file.pem
不加密私鑰檔案:
openssl pkcs12 -in file.p12 -out file.pem -nodes
列印PKCS#12格式的資訊值:
openssl pkcs12 -in file.p12 -info -noout
生成pkcs12檔案,但不包含CA證書:
openssl pkcs12 -export -inkey ocspserverkey.pem -in ocspservercert.pem -out ocspserverpkcs12.pfx
生成pcs12檔案,包含CA證書:
openssl pkcs12 -export -inkey ocspserverkey.pem -in ocspservercert.pem -CAfile demoCA/cacert.pem -chain -out ocsp1.pfx
將pcks12中的資訊分離出來,寫入檔案:
openssl pkcs12 –in ocsp1.pfx -out certandkey.pem
顯示pkcs12資訊:
openssl pkcs12 –in ocsp1.pfx -info
BUGS:
有一些爭論是PKCS#12的標準是一個大的BUG。
OpenSSL 0.9.6a以前的版本在PKCS#12的產生過程中有一個bug。在稀有的情況下用一個無效的金鑰來加密併產生PKCS#12檔案。這樣做的結果是一些PKCS#12檔案被其它的應用程式(MSIE或Netscape)會觸發這個bug。因為他們不會被OpenSSL或相似的OpenSSL在產生PKCS#12檔案時不能夠被加密。產生的通道相當的小:在256中比1還小。
一方面這個Bug的固定影響是老的無效的加密了的PKCS#12檔案不能夠被固定的版本所分析。在這種情況下,B會報告’ the MAC is OK but fail with a decryption error when extracting private keys’錯誤。
這個問題的解決方法是用老的OpenSSL版本從PKCS#12中來提起私鑰檔案和證書,用新的版本、提取到的證書、私鑰來重新建立PKCS#12檔案。例如:
old-openssl -in bad.p12 -out keycerts.pem
openssl -in keycerts.pem -export -name “My PKCS#12 file” -out fixed.p12