为什么“openssl pkcs12-in keystore.p12-out client-certificate.pem-clcerts-nokeys”需要-nokeys

为什么“openssl pkcs12-in keystore.p12-out client-certificate.pem-clcerts-nokeys”需要-nokeys,openssl,ssl-certificate,client-certificates,Openssl,Ssl Certificate,Client Certificates,我正在使用openssl生成客户端证书和密钥,这些证书和密钥将在稍后使用cUrl进行相互身份验证时使用 我正在使用以下命令生成客户端证书 openssl pkcs12-in keystore.p12-out client-certificate.pem-clcerts-nokeys 根据报告: -clcerts仅输出客户端证书 我的问题是,既然-clcerts只是输出客户端证书,为什么我们需要再次放置nokeys?谢谢一行程序的使用并不完全,手册页也没有太好 -clcerts和-cacerts的

我正在使用openssl生成客户端证书和密钥,这些证书和密钥将在稍后使用cUrl进行相互身份验证时使用

我正在使用以下命令生成客户端证书

openssl pkcs12-in keystore.p12-out client-certificate.pem-clcerts-nokeys

根据报告:

-clcerts仅输出客户端证书


我的问题是,既然-clcerts只是输出客户端证书,为什么我们需要再次放置nokeys?谢谢

一行程序的使用并不完全,手册页也没有太好

-clcerts和-cacerts的真正含义是:在输入中的证书中,仅当它们分别具有或不具有LocalKeyID时,才将它们包含在输出中,LocalKeyID通常用于EE证书,而不用于CA证书,见下文。这两者对privatekey都没有影响,privatekey仅由-nokeys和与加密任何输出密钥相关的选项控制,因此不带-nokeys的-clcerts将同时输出privatekey和带LocalKeyID证书的,但不带LocalKeyID证书的。由于此处的文件名为客户端证书,因此可能不需要这样做;如果是,则该文件应命名为client-key-and-cert

详细补充:该体系结构定义了两个概念上不同的类别:用于互联网通信、电子邮件或消息、程序或固件签名、护照等政府文件等有用内容并需要证书的终端实体;和证书颁发机构CA,它们共同受信任并向受信任方及其自身颁发证书。如今,EE证书不是由根信任CA直接颁发的,除非是在有限的组织环境或测试台中,而是由“中间”或“从属”CA颁发,这些CA拥有自己的证书,这些证书由根或更高级别的中间颁发,可能在到达根之前重复。在实践中,1种中间产物是最常见的,2种是相当常见的,更多的中间产物是罕见但可能的。要在该系统中安全地使用公钥,您需要EE证书和其上所有中间CA的证书,但不一定包括根证书或“[信任]锚”,它们构成了一个可以使用的证书

EE和CA证书通常通过和来区分,但并不总是如此;PKIX标准甚至不适用于所有互联网应用程序,更不用说外部应用程序了,即使在适用的地方,它们也不总是完全遵守。许多X.509证书处理的实现最初是在20世纪90年代创建的,在该标准的v3添加扩展之前,它们仍然可以在没有扩展的情况下运行。在任何情况下,openssl pkcs12都不使用此信息

证书的EE所有者通常需要匹配的私钥和“链”证书,该证书需要提供给依赖方发件人、收件人、用户等。PKCS12最初的PFX文件格式主要用于处理此问题;通常,PKCS12文件包含私钥和匹配的证书,以及任何需要的链证书。但是,该规范更加灵活,可以存储几乎任何私钥、证书的组合,有时还可以存储其他信息。然而,一种约定是,当存在私钥和匹配的证书时,两者都用具有相同值的标记。放在文件中与私钥不匹配的证书(通常但不一定是链式证书)不具有此属性

因此,在正常情况下,PKCS12包含一个EE密钥和证书+链CA证书,或者对于所有这些密钥和证书+链CA证书的几对不太常见的情况,-clcerts选择EE证书,即使许多EE不是客户端,-cacerts选择CA证书。但是,如果您有一个PKCS12,其中包含私钥和与CA匹配的证书,并且它的链证书是更高级别的CA,这是完全合理的,-clcerts选择与私钥匹配的CA证书,-cacerts选择其他CA证书。如果您的PKCS12包含与私钥不匹配的“额外”证书,-cacerts会选择它,即使它们实际上是EE证书,-clcerts不会;例如,当您直接信任受信任方(例如通信对等方)时,Java会对信任库文件执行此操作。如果Eric将这些选项拼写为“所有者证书”和“其他证书”,可能会更清楚,但现在改变已经晚了25年


PS:此命令没有生成任何内容。PKCS12已经包含privatekey和证书,这个命令只是将它们提取成一种可能更有用的不同形式。您生成密钥和证书所做的一切都是在此之前完成的。

使用一行程序并不是真正完整的,手册页也不是更好

-clcerts和-cacerts的真正含义是:在输入中的证书中,将它们包括在输出中 仅当它们分别具有或不具有LocalKeyID时,该ID通常用于EE证书,而不用于CA证书,请参见下文。这两者对privatekey都没有影响,privatekey仅由-nokeys和与加密任何输出密钥相关的选项控制,因此不带-nokeys的-clcerts将同时输出privatekey和带LocalKeyID证书的,但不带LocalKeyID证书的。由于此处的文件名为客户端证书,因此可能不需要这样做;如果是,则该文件应命名为client-key-and-cert

详细补充:该体系结构定义了两个概念上不同的类别:用于互联网通信、电子邮件或消息、程序或固件签名、护照等政府文件等有用内容并需要证书的终端实体;和证书颁发机构CA,它们共同受信任并向受信任方及其自身颁发证书。如今,EE证书不是由根信任CA直接颁发的,除非是在有限的组织环境或测试台中,而是由“中间”或“从属”CA颁发,这些CA拥有自己的证书,这些证书由根或更高级别的中间颁发,可能在到达根之前重复。在实践中,1种中间产物是最常见的,2种是相当常见的,更多的中间产物是罕见但可能的。要在该系统中安全地使用公钥,您需要EE证书和其上所有中间CA的证书,但不一定包括根证书或“[信任]锚”,它们构成了一个可以使用的证书

EE和CA证书通常通过和来区分,但并不总是如此;PKIX标准甚至不适用于所有互联网应用程序,更不用说外部应用程序了,即使在适用的地方,它们也不总是完全遵守。许多X.509证书处理的实现最初是在20世纪90年代创建的,在该标准的v3添加扩展之前,它们仍然可以在没有扩展的情况下运行。在任何情况下,openssl pkcs12都不使用此信息

证书的EE所有者通常需要匹配的私钥和“链”证书,该证书需要提供给依赖方发件人、收件人、用户等。PKCS12最初的PFX文件格式主要用于处理此问题;通常,PKCS12文件包含私钥和匹配的证书,以及任何需要的链证书。但是,该规范更加灵活,可以存储几乎任何私钥、证书的组合,有时还可以存储其他信息。然而,一种约定是,当存在私钥和匹配的证书时,两者都用具有相同值的标记。放在文件中与私钥不匹配的证书(通常但不一定是链式证书)不具有此属性

因此,在正常情况下,PKCS12包含一个EE密钥和证书+链CA证书,或者对于所有这些密钥和证书+链CA证书的几对不太常见的情况,-clcerts选择EE证书,即使许多EE不是客户端,-cacerts选择CA证书。但是,如果您有一个PKCS12,其中包含私钥和与CA匹配的证书,并且它的链证书是更高级别的CA,这是完全合理的,-clcerts选择与私钥匹配的CA证书,-cacerts选择其他CA证书。如果您的PKCS12包含与私钥不匹配的“额外”证书,-cacerts会选择它,即使它们实际上是EE证书,-clcerts不会;例如,当您直接信任受信任方(例如通信对等方)时,Java会对信任库文件执行此操作。如果Eric将这些选项拼写为“所有者证书”和“其他证书”,可能会更清楚,但现在改变已经晚了25年


PS:此命令没有生成任何内容。PKCS12已经包含privatekey和证书,这个命令只是将它们提取成一种可能更有用的不同形式。您生成密钥和证书所做的一切都是在此之前完成的。

顺便说一句,我从本博客获得了上一条命令。顺便说一下,我从这个博客上得到了之前的命令。谢谢你的回答,我现在很清楚了。很棒的解释。感谢您对属性的详细描述。令人惊叹的感谢您指出EE与CA证书。唯一的更正:区别在于存在基本约束扩展和CA:TRUE。见@B.Z.:基本正确,但与此无关;见扩展explanation@dave_thompson_085是的,的确如此。-cacert和-clcert不依赖于基本约束扩展。它取决于pkcs12文件中的LocalKeyID属性。使用openssl pkcs12命令对其进行验证。谢谢你的澄清!谢谢你的回答,我现在很清楚了。很棒的解释。感谢您对属性的详细描述。令人惊叹的感谢您指出EE与CA证书。唯一的更正:区别在于存在基本约束扩展和CA:TRUE。见@B
Z:基本正确,但与此无关;见扩展explanation@dave_thompson_085是的,的确如此。-cacert和-clcert不依赖于基本约束扩展。它取决于pkcs12文件中的LocalKeyID属性。使用openssl pkcs12命令对其进行验证。谢谢你的澄清!