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算法。
算法参数是要使用的加密算法,有效值包括aes128、aes256和des3。如果未指定此选项,则使用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的N、r或p参数。
- -saltlen
-
设置要用于PBE算法的盐的长度(以字节为单位)。如果未指定此值,则PBES2的默认值为16(128位),PBES1的默认值为8(64位)。
- -rand 文件, -writerand 文件
-
有关详细信息,请参阅openssl(1)中的“随机状态选项”。
- -engine id
-
请参阅openssl(1)中的“引擎选项”。此选项已弃用。
- -provider 名称
- -provider-path 路径
- -propquery 属性查询
注释
默认情况下,将密钥转换为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-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。
示例
使用默认参数(带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中获取副本。