【加密演算法】PFX檔案提取公鑰私鑰

Love Lenka發表於2017-09-21

方法1:

原版PFX證照

openssl pkcs12 -in myssl.pfx -nodes -out server.pem

 提取私鑰

openssl rsa -in server.pem -out server.key

提出公鑰

openssl x509 -in server.pem -out server.crt


方法2:

2.從pfx提取金鑰資訊,並轉換為key格式(pfx使用pkcs12模式補足)


  (1)提取金鑰對

       openssl pkcs12 -in 1.pfx -nocerts -nodes -out 1.key

       //如果pfx證照已加密,會提示輸入密碼。如果cer證照沒有安裝,則密碼沒法驗證


  (2)從金鑰對提取私鑰

       openssl rsa -in  1.key -out 1_pri.key

 

  (3)從金鑰對提取公鑰

       openssl rsa -in 1.key -pubout -out 1_pub.key


  (4)因為RSA演算法使用的是pkcs8模式補足,需要對提取的私鑰進一步處理

       openssl pkcs8 -topk8 -inform PEM -in 1_pri.key -outform PEM -nocrypt


       複製視窗中生成的金鑰,儲存為1_pri_pkcs8.key


  (5)得到金鑰對1_pri_pkcs8.key和1_pub.key


pkcs8格式的私鑰轉換工具。它處理在PKCS#8格式中的私鑰檔案。它可以用多樣的PKCS#5 (v1.5 and v2.0)和 PKCS#12演算法來處理沒有解密的PKCS#8 PrivateKeyInfo格式和EncryptedPrivateKeyInfo格式。
用法:
[cpp] view plaincopy
openssl pkcs8 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename]
[-passout arg] [-topk8] [-noiter] [-nocrypt] [-nooct] [-embed] [-nsdb] [-v2 alg] [-v1 alg] [-engine id]
選項說明:
-inform PEM|DER::輸入檔案格式,DER或者PEM格式。DER格式採用ASN1的DER標準格式。一般用的多的都是PEM格式,就是base64編碼格式。
-outform DER|PEM:輸出檔案格式,DER或者PEM格式。
-in filename:輸入的金鑰檔案,預設為標準輸入。如果金鑰被加密,會提示輸入一個金鑰口令。
-passin arg:輸入檔案口令保護來源。
-out filename:輸出檔案,預設為標準輸出。如果任何加密操作已經執行,會提示輸入一個金鑰值。輸出的檔名字不能和輸入的檔名一樣。
-passout arg:輸出檔案口令保護來源。
-topk8:通常的是輸入一個pkcs8檔案和傳統的格式私鑰檔案將會被寫出。設定了此選項後,位置轉換過來:輸入一個傳統格式的私鑰檔案,輸出一個PKCS#8格式的檔案。
-noiter:MAC保護計算次數為1。
-nocrypt:PKCS#8金鑰產生或輸入一般用一個適當地金鑰來加密PKCS#8 EncryptedPrivateKeyInfo結構。設定了此選項後,一個不加密的PrivateKeyInfo結構將會被輸出。這個選項一直不加密私 鑰檔案,在絕對必要的時候才能夠使用。某些軟體例如一些JAVA程式碼簽名軟體使用不加密的私鑰檔案。
-nooct:這個選項產生的RSA私鑰檔案是一個壞的格式,一些軟體將會使用。特別的是,私鑰檔案必須附上一個八位組字串,但是一些軟體僅僅包含本身的結構體沒有使八位組字串所環繞。不採用八位組表示私鑰。
-embed:這個選項產生的RSA私鑰檔案是一個壞的格式。在私鑰結構體中採用嵌入式DSA引數格式。在這個表單中,八位組字串包含了ASN1 SEQUENCE中的兩種結構:一個SEQUENCE包含了金鑰引數,一個ASN1 INTEGER包含私鑰值。
-nsdb:這個選項產生的RSA私鑰檔案是一個壞的格式併相容了Netscape私鑰檔案資料庫。採用NetscapeDB的DSA格式。
-v2 alg:採用PKCS#5 v2.0,並指定加密演算法,預設的是PKCS#8私鑰檔案被叫做B<pbeWithMD5AndDES-CBC>(該演算法用56位元組的DES 加密但是在PKCS#5 v1.5中有更加強壯的加密演算法)的加密演算法用口令進行加密。用B<-v2>選項,PKCS#5 v2.0相關的演算法將會被使用,可以是des3(168位元組)和rc2(128位元組),推薦des3。
-v1 alg:採用PKCS#5 v1.5或pkcs12,並指定加密演算法。可採用的演算法見下面。
-engine id:指定硬體引擎。
注意:
加密了的PEM編碼PKCS#8檔案表單用下面的頭部和尾部:
-----BEGIN ENCRYPTED PRIVATE KEY-----
-----END ENCRYPTED PRIVATE KEY-----
未加密的表單用:
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
跟傳統的SSLeay演算法相比,用PKCS#5 v2.0系列的演算法加密私鑰,有更高的安全性以及迭代次數。於是附加的安全性是經過深思熟慮的。
預設的加密演算法僅僅是56位元組的,是因為它是PKCS#8所支援的最好的方法。
有一些軟體使用PKCS#12基於金鑰的加密演算法來加密PKCS#8格式的私鑰:它們會自動的處理但是沒有選項來操作。
在PKCS#8格式中,有可能的是輸出DER編碼格式的經過加密的私鑰檔案,是因為加密的詳細說明包含在DER等級中,相反的是傳統的格式包含在PEM鄧麗中。
PKCS#5 v1.5和 PKCS#12 演算法:
各種各樣的演算法可以被選項-v1所使用。包含PKCS#5 v1.5和 PKCS#12 演算法。詳細描述如下:
B<PBE-MD2-DES PBE-MD5-DES>:這兩個演算法包含在PKCS#5 v1.5中。它們僅僅提供56位元組的保護,加密演算法用DES。
B<PBE-SHA1-RC2-64 PBE-MD2-RC2-64 PBE-MD5-RC2-64 PBE-SHA1-DES>:它們在傳統的PKCS#5 v1.5中沒有被提到,但是它們用同樣地金鑰引出演算法,被一些軟體所支援。在PKCS#5 v2.0中所提到。它們使用64位元組的RC2以及56位元組的DES。
B<PBE-SHA1-RC4-128 PBE-SHA1-RC4-40 PBE-SHA1-3DES PBE-SHA1-2DES PBE-SHA1-RC2-128 PBE-SHA1-RC2-40>:它們是PKCS#12基於金鑰的加密演算法,它們允許使用高強度的加密演算法,例如3des或128位的RC2。
例項:
用3des演算法將傳統的私鑰檔案轉換為PKCS#5 v2.0:
[cpp] view plaincopy
openssl pkcs8 -in key.pem -topk8 -v2 des3 -out enckey.pem

用PKCS#5 1.5相容的DES演算法將私鑰檔案轉換為pkcs8檔案:
[html] view plaincopy
openssl pkcs8 -in ocspserverkey.pem -topk8 -out ocspkcs8key.pem

用PKCS#12相容的3DES演算法將私鑰檔案轉換為pkcs8檔案:
[html] view plaincopy
openssl pkcs8 -in key.pem -topk8 -out enckey.pem -v1 PBE-SHA1-3DES

讀取一個DER格式加密了的PKCS#8格式的私鑰:
[cpp] view plaincopy
openssl pkcs8 -inform DER -nocrypt -in key.der -out key.pem

轉換一個PKCS#8格式的私鑰到傳統的私鑰:
[cpp] view plaincopy
openssl pkcs8 -in pk8.pem -out key.pem

pkcs8中的私鑰以明文存放:
[html] view plaincopy
openssl pkcs8 -in ocspserverkey.pem -topk8 -nocrypt -out ocspkcs8key.pem

標準:
PKCS#5 v2.0的測試向量的實現是以通告的形式用高強度的迭代次數演算法3DES、DES和RC2來加密的。很多人要確認能夠解密產生的私鑰。
PKCS#8格式的DSA私鑰檔案沒有備註檔案中的:在PKCS#11 v2.01中的11.9節被隱藏了的。OpenSSL的預設DSA PKCS#8私鑰格式隱藏在這個標準中。
BUGs:
必須有一個選項列印使用的加密演算法的其他詳細細節,例如迭代次數。
PKCS#8用3DES和PKCS#5 v2.0必須是預設的私鑰檔案:目前為了命令的相容性。

相關文章