openssl-pkcs8
名稱
openssl-pkcs8 - PKCS#8 格式私人金鑰轉換指令
語法
openssl pkcs8 [-help] [-topk8] [-inform DER|PEM] [-outform DER|PEM] [-in filename] [-passin arg] [-out filename] [-passout arg] [-iter count] [-noiter] [-nocrypt] [-traditional] [-v2 alg] [-v2prf alg] [-v1 alg] [-scrypt] [-scrypt_N N] [-scrypt_r r] [-scrypt_p p] [-saltlen size] [-rand files] [-writerand file] [-engine id] [-provider name] [-provider-path path] [-propquery propq]
說明
此指令處理 PKCS#8 格式的私人金鑰。它可以處理未加密的 PKCS#8 PrivateKeyInfo 格式和使用各種 PKCS#5 (v1.5 和 v2.0) 和 PKCS#12 演算法的 EncryptedPrivateKeyInfo 格式。
選項
- -help
-
列印使用說明訊息。
- -topk8
-
通常會在輸入時預期 PKCS#8 私人金鑰,並會將私人金鑰寫入輸出檔案。使用 -topk8 選項時,情況會相反:它會讀取私人金鑰並寫入 PKCS#8 格式金鑰。
- -inform DER|PEM, -outform DER|PEM
-
輸入和格式;預設為 PEM。有關詳細資訊,請參閱 openssl-format-options(1)。
如果金鑰從 PKCS#8 格式轉換(即未使用 -topk8 選項),則輸入檔案必須為 PKCS#8 格式。除非包含 -nocrypt,否則預期為加密金鑰。
如果未使用 -topk8 並設定 PEM 模式,則輸出檔案將為 PKCS#8 格式的未加密私人金鑰。如果使用 -traditional 選項,則會改寫入傳統格式的私人金鑰。
如果未使用 -topk8 並設定 DER 模式,則輸出檔案將為傳統 DER 格式的未加密私人金鑰。
如果使用 -topk8,則輸入檔案中任何受支援的私密金鑰都可以使用 -inform 指定的格式。除非包含 -nocrypt,否則輸出檔案將使用指定的加密參數加密 PKCS#8 格式。
- -traditional
-
如果存在此選項且 -topk8 不是傳統格式,則會寫入私密金鑰。
- -in filename
-
如果未指定此選項,則這會指定要從中讀取金鑰的輸入檔名或標準輸入。如果金鑰已加密,則會提示輸入密碼。
- -passin arg, -passout arg
-
輸入和輸出檔案的密碼來源。有關 arg 格式的更多資訊,請參閱 openssl-passphrase-options(1)。
- -out filename
-
這會指定要寫入金鑰的輸出檔名或預設的標準輸出。如果設定任何加密選項,則會提示輸入密碼。輸出檔名不應與輸入檔名相同。
- -iter count
-
在建立新的 PKCS#8 容器時,在衍生 PKCS#8 輸出的加密金鑰時,使用密碼的指定迭代次數。較高的值會增加暴力破解 PKCS#8 容器所需的時間。
- -noiter
-
在建立新的 PKCS#8 容器時,使用 1 作為迭代次數。
- -nocrypt
-
產生的或輸入的 PKCS#8 金鑰通常是使用適當的基於密碼的加密演算法的 PKCS#8 EncryptedPrivateKeyInfo 結構。使用此選項時,會預期或輸出未加密的 PrivateKeyInfo 結構。此選項完全不會加密私密金鑰,且僅應在絕對必要時使用。某些軟體(例如某些版本的 Java 程式碼簽署軟體)會使用未加密的私密金鑰。
- -v2 alg
-
此選項設定 PKCS#5 v2.0 演算法。
alg 參數是要使用的加密演算法,有效值包括 aes128、aes256 和 des3。如果未指定此選項,則會使用 aes256。
- -v2prf alg
-
此選項設定要與 PKCS#5 v2.0 搭配使用的 PRF 演算法。典型的值會是 hmacWithSHA256。如果未設定此選項,則會使用密碼的預設值,或在沒有預設值的情況下使用 hmacWithSHA256。
有些實作可能不支援自訂 PRF 演算法,且可能需要 hmacWithSHA1 選項才能運作。
- -v1 alg
-
此選項表示應使用 PKCS#5 v1.5 或 PKCS#12 演算法。有些較舊的實作可能不支援 PKCS#5 v2.0,且可能需要此選項。如果未指定,則會使用 PKCS#5 v2.0 格式。
- -scrypt
-
使用 scrypt 演算法來加密私密金鑰,使用預設參數:目前 N=16384、r=8 和 p=1,以及使用 256 位元金鑰的 CBC 模式中的 AES。這些參數可以使用 -scrypt_N、-scrypt_r、-scrypt_p 和 -v2 選項來修改。
- -scrypt_N N, -scrypt_r r, -scrypt_p p
-
設定 scrypt N、r 或 p 參數。
- -saltlen
-
設定 PBE 演算法要使用的鹽長度(以位元組為單位)。如果未指定此值,PBES2 的預設值為 16(128 位元),PBES1 的預設值為 8(64 位元)。
- -rand files、-writerand file
-
請參閱 openssl(1) 中的「隨機狀態選項」 以取得詳細資料。
- -engine id
-
請參閱 openssl(1) 中的「引擎選項」。此選項已不建議使用。
- -provider name
- -provider-path path
- -propquery propq
備註
預設情況下,將金鑰轉換為 PKCS#8 格式時,會使用 PKCS#5 v2.0,並搭配 HMAC 和 SHA256 使用 256 位元 AES。
有些較舊的實作不支援 PKCS#5 v2.0 格式,而需要較舊的 PKCS#5 v1.5 格式,可能還需要不安全的弱加密演算法,例如 56 位元 DES。
使用 PKCS#5 v2.0 演算法和高反覆計數加密的私密金鑰比使用傳統 SSLeay 相容格式加密的私密金鑰更安全。因此,如果額外的安全性被認為很重要,則應轉換金鑰。
可以寫出 PKCS#8 格式的 DER 編碼加密私密金鑰,因為加密詳細資料包含在 ASN1 層級中,而傳統格式則包含在 PEM 層級中。
PKCS#5 V1.5 和 PKCS#12 演算法
可以使用各種演算法搭配 -v1 命令列選項,包括 PKCS#5 v1.5 和 PKCS#12。以下將更詳細地說明這些演算法。
- PBE-MD2-DES PBE-MD5-DES
-
這些演算法包含在原始的 PKCS#5 v1.5 規範中。它們只提供 56 位元的保護,因為它們都使用 DES。
- 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。
- PBE-SHA1-RC4-128、PBE-SHA1-RC4-40、PBE-SHA1-3DES、PBE-SHA1-2DES、PBE-SHA1-RC2-128、PBE-SHA1-RC2-40
-
這些演算法使用 PKCS#12 基於密碼的加密演算法,並允許使用強加密演算法,例如三重 DES 或 128 位元 RC2。
範例
使用預設參數(AES 搭配 256 位元金鑰和 hmacWithSHA256)將私密金鑰轉換為 PKCS#8 格式
openssl pkcs8 -in key.pem -topk8 -out enckey.pem
將私密金鑰轉換為 PKCS#8 未加密格式
openssl pkcs8 -in key.pem -topk8 -nocrypt -out enckey.pem
使用三重 DES 將私密金鑰轉換為 PKCS#5 v2.0 格式
openssl pkcs8 -in key.pem -topk8 -v2 des3 -out enckey.pem
使用 CBC 模式中的 AES 搭配 256 位元和 hmacWithSHA512 PRF 將私密金鑰轉換為 PKCS#5 v2.0 格式
openssl pkcs8 -in key.pem -topk8 -v2 aes-256-cbc -v2prf hmacWithSHA512 -out enckey.pem
使用相容於 PKCS#5 1.5 的演算法(DES)將私密金鑰轉換為 PKCS#8
openssl pkcs8 -in key.pem -topk8 -v1 PBE-MD5-DES -out enckey.pem
使用相容於 PKCS#12 的演算法(3DES)將私密金鑰轉換為 PKCS#8
openssl pkcs8 -in key.pem -topk8 -out enckey.pem -v1 PBE-SHA1-3DES
讀取 DER 未加密 PKCS#8 格式的私密金鑰
openssl pkcs8 -inform DER -nocrypt -in key.der -out key.pem
將私密金鑰從任何 PKCS#8 加密格式轉換為傳統格式
openssl pkcs8 -in pk8.pem -traditional -out key.pem
將私密金鑰轉換為 PKCS#8 格式,使用 AES-256 加密,並使用密碼進行一百萬次反覆運算
openssl pkcs8 -in key.pem -topk8 -v2 aes-256-cbc -iter 1000000 -out pk8.pem
標準
此 PKCS#5 v2.0 實作的測試向量已使用三重 DES、DES 和 RC2 搭配高反覆運算次數發佈到 pkcs-tng 郵件清單,多位人士確認他們可以解密產生的私密金鑰,因此可以假設 PKCS#5 v2.0 實作至少在這些演算法的範圍內相當準確。
PKCS#8 DSA(和其他)私密金鑰的格式並未妥善記錄:它隱藏在 PKCS#11 v2.01 的第 11.9 節中。OpenSSL 的預設 DSA PKCS#8 私密金鑰格式符合此標準。
錯誤
應有一個選項可以列印出正在使用的加密演算法和其他詳細資料,例如反覆運算次數。
另請參閱
openssl(1)、openssl-dsa(1)、openssl-rsa(1)、openssl-genrsa(1)、openssl-gendsa(1)
歷史記錄
-iter 選項已新增至 OpenSSL 1.1.0。
-engine 選項已在 OpenSSL 3.0 中棄用。
版權
版權所有 2000-2023 OpenSSL 專案作者。保留所有權利。
根據 Apache 授權條款 2.0(「授權條款」)授權。您不得在不遵守授權條款的情況下使用此檔案。您可以在原始程式碼散佈中的 LICENSE 檔案中取得副本,或至 https://www.openssl.org/source/license.html 取得副本。