在将一些证书从keystore转换为openssl / pem时,我第一次注意到证书前面有“Bag Attributes”。
看起来像这样:
Bag Attributes
friendlyName: CN=PositiveSSL CA,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB
subject=/C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=PositiveSSL CA
issuer=/C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN-USERFirst-Hardware
他们是否提供任何功能?
我注意到我喜欢它们,因为它们使我的链文件(证书的串联)更加清晰。可悲的是,我下载的ca证书没有它们。
那么我该如何生成它们?
答案 0 :(得分:15)
确切地说,您显然意味着使用openssl pkcs12 (import)
实用程序转换(或仅读取)PKCS#12文件,Java可以将其作为密钥库支持,但在Java9之前不是默认(更新) 2017. PKCS#12被设计并且通常用于私钥和证书(通常是多个)用于该密钥,尽管格式足够灵活以允许单独的证书。 OpenSSL 命令行 pkcs12 -export
需要私钥,虽然它会添加“额外”证书,而调用 API 的程序显然不会执行私钥。根据我的经验,Java在版本8之前不支持PKCS#12中的单独证书,而在我的8和9中则支持两个属性:pkcs9.friendlyName和2.16.840.1.113894.746875.1.1这显然是Oracle定义的trustedKeyUsage。大多数单独的证书不会作为PKCS#12存储或下载。
PKCS#12是根据包含各种内容的几个(略有不同)“bag”结构定义的,主要是privatekeys和带有可选属性的证书,这些属性不出所料地被称为“包属性”;你的情况(显然)只有证书。这些属性遵循现在常规结构的任意数量的OID对值取决于OID。请注意,在您的显示中只有friendlyName
是一个包属性,因为它在标题下缩进。
subject=
和issuer=
行是来自证书本身的字段 openssl pkcs12 (import)
实用程序提取并打印以方便使用。如果这已足够,您可以使用x509
实用程序为任何证书显示它们;特别是如果你想在pkcs12
输出方式的PEM编码证书“blob”之前使用它们,请使用openssl x509 -in infile -subject -issuer -out outfile
。这样做一个证书,因此如果您在PEM文件中有一个链,则需要将其拆分并分别执行每个证书,然后可能再次合并;例如
# split into files cert_1, cert_2, etc.
$ awk <chain.pem -va="openssl x509 -subject -issuer >cert_"
'/^-----BEGIN/{b=a (++n);x=1}x{print|b}/^-----END/{close(b);x=0}'
# output entire "bag" to stdout (with blank lines between certs)
$ awk <chain.pem -va="openssl x509 -subject -issuer" \
'/^-----BEGIN/{b=a;x=1}x{print|b}/^-----END/{close(b);x=0;print""}'
作为比较,openssl s_client -showcerts
做了类似的事情:它从收到的链中输出每个证书blob的主题和发行者,用级别号“s:”和“i:”标记它们。