OpenSSL

密码学和SSL/TLS工具包

openssl-pkcs8

名称

openssl-pkcs8 - PKCS#8 格式私钥转换命令

语法

openssl pkcs8 [-help] [-topk8] [-inform DER|PEM] [-outform DER|PEM] [-in 文件名] [-passin 参数] [-out 文件名] [-passout 参数] [-iter 计数] [-noiter] [-nocrypt] [-traditional] [-v2 算法] [-v2prf 算法] [-v1 算法] [-scrypt] [-scrypt_N N] [-scrypt_r r] [-scrypt_p p] [-saltlen 大小] [-rand 文件] [-writerand 文件] [-engine id] [-provider 名称] [-provider-path 路径] [-propquery 属性查询]

描述

此命令处理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 文件名

这指定要从中读取密钥的输入文件名,或者如果未指定此选项则为标准输入。如果密钥已加密,则会提示输入密码短语。

-passin 参数, -passout 参数

输入和输出文件的密码源。有关参数格式的更多信息,请参阅openssl-passphrase-options(1)

-out 文件名

这指定要将密钥写入的输出文件名,或者默认为标准输出。如果设置了任何加密选项,则会提示输入密码短语。输出文件名不应与输入文件名相同。

-iter 计数

在创建新的PKCS#8容器时,在导出PKCS#8输出的加密密钥时,对密码使用给定次数的迭代。较高的值会增加蛮力破解PKCS#8容器所需的时间。

-noiter

在创建新的PKCS#8容器时,将迭代计数设置为1。

-nocrypt

生成的或输入的PKCS#8密钥通常是使用适当的基于密码的加密算法的PKCS#8 EncryptedPrivateKeyInfo结构。使用此选项时,预期或输出未加密的PrivateKeyInfo结构。此选项根本不加密私钥,并且仅在绝对必要时才应使用。某些软件(例如某些版本的Java代码签名软件)使用未加密的私钥。

-v2 算法

此选项设置PKCS#5 v2.0算法。

算法参数是要使用的加密算法,有效值包括aes128aes256des3。如果未指定此选项,则使用aes256

-v2prf 算法

此选项设置要与PKCS#5 v2.0一起使用的PRF算法。典型的值将是hmacWithSHA256。如果未设置此选项,则使用密码的默认值,或者如果没有默认值,则使用hmacWithSHA256

某些实现可能不支持自定义PRF算法,并且可能需要hmacWithSHA1选项才能工作。

-v1 算法

此选项指示应使用PKCS#5 v1.5或PKCS#12算法。某些旧版实现可能不支持PKCS#5 v2.0,并且可能需要此选项。如果未指定,则使用PKCS#5 v2.0格式。

-scrypt

使用scrypt算法进行私钥加密,使用默认参数:当前N=16384、r=8和p=1,以及CBC模式下的AES,密钥长度为256位。可以使用-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 文件, -writerand 文件

有关详细信息,请参阅openssl(1)中的“随机状态选项”

-engine id

请参阅openssl(1)中的“引擎选项”。此选项已弃用。

-provider 名称
-provider-path 路径
-propquery 属性查询

请参阅openssl(1)中的“提供程序选项”provider(7)property(7)

注释

默认情况下,将密钥转换为PKCS#8格式时,使用PKCS#5 v2.0,使用256位AES和HMAC以及SHA256。

某些旧版实现不支持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规范中。由于它们都使用DES,因此它们仅提供56位的保护。

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。

示例

使用默认参数(带256位密钥的AES和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模式下的256位AES和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实现的测试向量已发布到pkcs-tng邮件列表,使用三重DES、DES和RC2以及高迭代次数,一些人确认他们可以解密生成的私钥,因此,可以假设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中获取副本。