OpenSSL

密码学和 SSL/TLS 工具包

openssl-pkcs12

名称

openssl-pkcs12 - PKCS#12 文件命令

概要

openssl pkcs12 [-help] [-passin arg] [-passout arg] [-password arg] [-twopass] [-in filename|uri] [-out filename] [-nokeys] [-nocerts] [-noout] [-legacy] [-engine id] [-provider name] [-provider-path path] [-propquery propq] [-rand files] [-writerand file]

PKCS#12 输入(解析)选项:[-info] [-nomacver] [-clcerts] [-cacerts]

[-aes128] [-aes192] [-aes256] [-aria128] [-aria192] [-aria256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-noenc] [-nodes]

PKCS#12 输出(导出)选项

[-export] [-inkey filename|uri] [-certfile filename] [-passcerts arg] [-chain] [-untrusted filename] [-CAfile file] [-no-CAfile] [-CApath dir] [-no-CApath] [-CAstore uri] [-no-CAstore] [-name name] [-caname name] [-CSP name] [-LMK] [-keyex] [-keysig] [-keypbe cipher] [-certpbe cipher] [-descert] [-macalg digest] [-iter count] [-noiter] [-nomaciter] [-maciter] [-macsaltlen] [-nomac] [-jdktrust usage]

描述

此命令允许创建和解析 PKCS#12 文件(有时称为 PFX 文件)。PKCS#12 文件被许多程序使用,包括 Netscape、MSIE 和 MS Outlook。

选项

有很多选项,其中一些选项的含义取决于是否正在创建或解析 PKCS#12 文件。默认情况下会解析 PKCS#12 文件。可以通过使用 -export 选项创建 PKCS#12 文件(见下文)。PKCS#12 导出加密和 MAC 选项(例如 -certpbe-iter)以及其他许多选项(例如 -chain)仅与 -export 相关。相反,在输出 PKCS#12 输入时,关于私钥加密的选项仅与未给出 -export 选项时相关。

默认加密算法是使用 PBKDF2 进行密钥派生的 AES-256-CBC。

在遇到加载涉及例如 RC2-40-CBC 的遗留 PKCS#12 文件的问题时,请尝试使用 -legacy 选项,并在需要时使用 -provider-path 选项。

-help

打印使用消息。

-passin arg

输入的密码源,以及用于加密任何输出的私钥的密码源。有关 arg 格式的更多信息,请参见 openssl-passphrase-options(1)

-passout arg

输出文件的密码源。

-password arg

使用 -export 时,-password 等效于 -passout,否则等效于 -passin

-twopass

提示输入单独的完整性和加密密码:大多数软件始终假定这些密码相同,因此此选项将使此类 PKCS#12 文件无法读取。不能与选项 -password-passin(如果从 PKCS#12 导入)或 -passout(如果导出)结合使用。

-nokeys

不会输出任何私钥。

-nocerts

不会输出任何证书。

-noout

此选项会禁止输出所有凭据,因此输入仅被验证。

-legacy

使用遗留操作模式并自动加载遗留提供程序。如果 OpenSSL 未在系统范围内安装,则有必要也使用例如 -provider-path ./providers,或者将环境变量 OPENSSL_MODULES 设置为指向可以找到提供程序的目录。

在遗留模式下,证书加密的默认算法是 RC2_CBC 或 3DES_CBC,具体取决于构建中是否启用了 RC2 密码。私钥加密的默认算法是 3DES_CBC。如果未指定遗留选项,则不会加载遗留提供程序,证书和私钥的默认加密算法都是使用 PBKDF2 进行密钥派生的 AES_256_CBC。

-engine id

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

-provider name
-provider-path path
-propquery propq

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

-rand files, -writerand file

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

PKCS#12 输入(解析)选项

-in filename|uri

这指定了输入文件名或 URI。默认情况下使用标准输入。在没有 -export 选项的情况下,这必须是待解析的 PKCS#12 文件。有关与 -export 选项一起使用,请参见 “PKCS#12 输出(导出)选项” 部分。

-out filename

要将证书和私钥写入的文件名,默认情况下为标准输出。它们都以 PEM 格式写入。

-info

输出有关 PKCS#12 文件结构、所用算法和迭代次数的附加信息。

-nomacver

不要尝试验证完整性 MAC。

-clcerts

仅输出客户端证书(而不是 CA 证书)。

-cacerts

仅输出 CA 证书(而不是客户端证书)。

-aes128, -aes192, -aes256

使用 AES 加密私钥,然后再输出。

-aria128, -aria192, -aria256

使用 ARIA 加密私钥,然后再输出。

-camellia128, -camellia192, -camellia256

使用 Camellia 加密私钥,然后再输出。

-des

使用 DES 加密私钥,然后再输出。

-des3

使用三重 DES 加密私钥,然后再输出。

-idea

使用 IDEA 加密私钥,然后再输出。

-noenc

根本不加密私钥。

-nodes

此选项自 OpenSSL 3.0 起已弃用;请改用 -noenc

PKCS#12 输出(导出)选项

-export

此选项指定将创建 PKCS#12 文件而不是解析它。

-out filename

这指定了要将 PKCS#12 文件写入的文件名。默认情况下使用标准输出。

-in filename|uri

这指定了输入文件名或 URI。默认情况下使用标准输入。使用 -export 选项时,这是一个包含证书和密钥的文件,或者是一个引用通过引擎访问的密钥的 URI。文件中凭据的顺序无关紧要,但应该存在一个私钥及其相应的证书。如果存在其他证书,它们也将包含在 PKCS#12 输出文件中。

-inkey filename|uri

PKCS12 输出的私钥输入。如果未指定此选项,则输入文件(-in 参数)必须包含私钥。如果没有使用引擎,则该参数将被视为文件。如果使用了 -engine 选项或 URI 有前缀 org.openssl.engine:,则该 URI 的其余部分将被视为给定引擎的密钥标识符。

-certfile filename

包含要添加到 PKCS#12 输出中的额外证书的输入文件,前提是给出了 -export 选项。

-passcerts arg

证书输入(例如 -certfile-untrusted)的密码源。有关 arg 格式的更多信息,请参见 openssl-passphrase-options(1)

-chain

如果存在此选项,则会构建最终实体证书的证书链并将其包含在 PKCS#12 输出文件中。最终实体证书是如果未给出密钥,则从 -in 文件中读取的第一个证书,否则是与给定密钥匹配的第一个证书。标准 CA 信任存储用于链构建,以及使用 -untrusted 选项给出的任何不受信任的 CA 证书。

-untrusted filename

不受信任证书的输入文件,这些证书可用于链构建,这仅在使用 -export 选项创建 PKCS#12 文件并且也给出了 -chain 选项时才相关。任何实际上是链一部分的证书都将添加到输出中。

-CAfile file, -no-CAfile, -CApath dir, -no-CApath, -CAstore uri, -no-CAstore

有关详细信息,请参见 openssl-verification-options(1) 中的“受信任证书选项”

-name friendlyname

这指定了证书和私钥的“友好名称”。此名称通常在导入该文件的软件的列表框中显示。

-caname friendlyname

这指定了其他证书的“友好名称”。此选项可以多次使用以指定所有证书的名称,其顺序与它们出现的顺序相同。Netscape 会忽略其他证书上的友好名称,而 MSIE 会显示它们。

-CSP name

name 写入 Microsoft CSP 名称。输入的密码源,以及用于加密任何输出的私钥的密码源。有关 arg 格式的更多信息,请参见 openssl-passphrase-options(1)

-LMK

向属性添加“本地密钥集”标识符。

-keyex|-keysig

指定私钥将用于密钥交换或仅用于签名。此选项仅由 MSIE 和类似的 MS 软件解释。通常,“导出级别”软件仅允许 512 位 RSA 密钥用于加密目的,但允许任意长度的密钥用于签名。-keysig 选项将密钥标记为仅用于签名。仅签名密钥可用于 S/MIME 签名、Authenticode(ActiveX 控件签名)和 SSL 客户端身份验证,但是,由于存在错误,只有 MSIE 5.0 及更高版本支持将仅签名密钥用于 SSL 客户端身份验证。

-keypbe alg, -certpbe alg

这些选项允许选择用于加密私钥和证书的算法。可以使用任何 PKCS#5 v1.5 或 PKCS#12 PBE 算法名称(有关更多信息,请参见 “注释” 部分)。如果指定了密码名称(如 openssl list -cipher-algorithms 输出),则它将与 PKCS#5 v2.0 一起使用。出于互操作性的原因,建议仅使用 PKCS#12 算法。

特殊值 NONE 会禁用私钥和证书的加密。

-descert

使用三重 DES 加密证书。默认情况下,私钥和证书使用 AES-256-CBC 加密,除非使用了 '-legacy' 选项。如果 '-descert' 与 '-legacy' 一起使用,则私钥和证书都使用三重 DES 加密。

-macalg digest

指定 MAC 摘要算法。如果没有包含,则将使用 SHA256。

-iter count

此选项指定了加密密钥和 MAC 的迭代次数。默认值为 2048。

为了通过使用常见的密码的大型字典来阻止攻击,从密码派生密钥的算法可以应用迭代次数:这会导致算法的某个部分重复并减慢其速度。MAC 用于检查文件完整性,但由于它通常与密钥和证书具有相同的密码,因此它也可能受到攻击。

-noiter, -nomaciter

默认情况下,加密和 MAC 迭代次数都设置为 2048,使用这些选项,MAC 和加密迭代次数可以设置为 1,由于这会降低文件安全性,因此除非绝对必要,否则不要使用这些选项。大多数软件都支持 MAC 和加密迭代次数。MSIE 4.0 不支持 MAC 迭代次数,因此它需要 -nomaciter 选项。

-maciter

此选项是为了与以前的版本兼容而包含的,它曾经是使用 MAC 迭代次数所必需的,但现在默认情况下使用它们。

-macsaltlen

此选项指定 MAC 的盐长度(以字节为单位)。根据 NIST SP 800-132,盐长度应至少为 16 字节。默认值为 8 字节,以保持向后兼容性。

-nomac

不尝试提供 MAC 完整性。这在使用 FIPS 提供程序时很有用,因为 PKCS12 MAC 需要 PKCS12KDF,而 PKCS12KDF 不是经过批准的 FIPS 算法,无法由 FIPS 提供程序支持。

-jdktrust

以与 Java 密钥库使用兼容的格式导出 pkcs12 文件。此选项接受一个字符串参数,指示要授予与其关联的证书的信任 OID 名称。目前仅定义了“anyExtendedKeyUsage”。请注意,由于 Java 密钥库不接受同时包含可信证书和密钥对的 PKCS12 文件,因此使用此选项意味着设置 **-nokeys** 选项。

说明

虽然有许多选项,但大多数选项很少使用。对于 PKCS#12 文件解析,仅需要使用 **-in** 和 **-out**;对于 PKCS#12 文件创建,还需要使用 **-export** 和 **-name**。

如果不存在 **-clcerts**、**-cacerts** 或 **-nocerts** 选项,则所有证书将按其在输入 PKCS#12 文件中出现的顺序输出。不能保证第一个出现的证书是与私钥相对应的证书。某些软件尝试获取私钥和相应的证书,可能会假设文件中的第一个证书是与私钥相对应的证书,但情况并非总是如此。使用 **-clcerts** 选项将通过仅输出与私钥相对应的证书来解决此问题。如果需要 CA 证书,则可以使用 **-nokeys** **-cacerts** 选项将它们输出到单独的文件中,以仅输出 CA 证书。

**-keypbe** 和 **-certpbe** 算法允许指定私钥和证书的精确加密算法。通常默认值就足够了,但有时软件无法处理使用三重 DES 加密的私钥,此时可以使用选项 **-keypbe** *PBE-SHA1-RC2-40* 将私钥加密降至 40 位 RC2。所有算法的完整描述包含在 openssl-pkcs8(1) 中。

在 1.1 版本之前,包含非 ASCII 字符的密码以不符合标准的方式编码,这限制了互操作性,尤其是与 Windows 的互操作性。但切换到符合标准的密码编码会导致无法访问使用损坏编码保护的旧数据。为此,即使在读取数据时也会尝试使用旧编码。如果您在生产应用程序中使用 PKCS#12 文件,建议您转换数据,因为已实现的启发式方法不是 MT 安全的,其唯一目标是使用此命令简化数据升级。

示例

解析 PKCS#12 文件并将其输出到 PEM 文件

openssl pkcs12 -in file.p12 -out file.pem

仅将客户端证书输出到文件

openssl pkcs12 -in file.p12 -clcerts -out file.pem

不要加密私钥

openssl pkcs12 -in file.p12 -out file.pem -noenc

打印有关 PKCS#12 文件的一些信息

openssl pkcs12 -in file.p12 -info -noout

以旧版模式打印有关 PKCS#12 文件的一些信息

openssl pkcs12 -in file.p12 -info -noout -legacy

从可能包含密钥和证书的 PEM 文件创建 PKCS#12 文件

openssl pkcs12 -export -in file.pem -out file.p12 -name "My PSE"

包含一些额外的证书

openssl pkcs12 -export -in file.pem -out file.p12 -name "My PSE" \
 -certfile othercerts.pem

导出一个 PKCS#12 文件,其中包含来自证书 PEM 文件和包含密钥的另一个 PEM 文件的数据,使用与旧版提供程序相同的默认算法

openssl pkcs12 -export -in cert.pem -inkey key.pem -out file.p12 -legacy

另请参见

openssl(1)openssl-pkcs8(1)ossl_store-file(7)

历史

**-engine** 选项在 OpenSSL 3.0 中已弃用。**-nodes** 选项在 OpenSSL 3.0 中也已弃用;请改为使用 **-noenc**。

版权所有 2000-2021 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0 版(“许可证”)许可。除非遵守许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件中或在 https://www.openssl.org/source/license.html 中获取副本。