OpenSSL

加密和 SSL/TLS 工具包

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 參數是要使用的加密演算法,有效值包括 aes128aes256des3。如果未指定此選項,則會使用 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 Nrp 參數。

-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

請參閱 openssl(1) 中的「提供者選項」provider(7)property(7)

備註

預設情況下,將金鑰轉換為 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-64PBE-MD2-RC2-64PBE-MD5-RC2-64PBE-SHA1-DES

這些演算法未在原始的 PKCS#5 v1.5 規範中提及,但它們使用相同的金鑰衍生演算法,並受到一些軟體的支援。它們在 PKCS#5 v2.0 中有提及。它們使用 64 位元 RC2 或 56 位元 DES。

PBE-SHA1-RC4-128PBE-SHA1-RC4-40PBE-SHA1-3DESPBE-SHA1-2DESPBE-SHA1-RC2-128PBE-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 取得副本。