我正在尝试转换这个文件以 DER 格式转换为 PEM 格式。
使用 openssl.exe 实用程序(在 openssl 0.98.1 和 1.02 版本中尝试过)我尝试了以下命令:
openssl x509 -inform der PA_AD_RB_V2_3.der -out PA_AD_RB_V2_3.pem
openssl pkcs7 -inform der PA_AD_RB_V2_3.der -print_certs -out PA_AD_RB_V2_3.pem
openssl rsa -inform der -in PA_AD_RB_V2_3.der -out PA_AD_RB_V2_3.pem
它们均返回以下错误:
16196:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:./crypto/asn1/tasn_dec.c:1294: 16196:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:./crypto/asn1/tasn_dec.c:830: 16196:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:./crypto/asn1/tasn_dec.c:749:Field=type, Type=PKCS7
当然,命令之间会有一些差异,但消息是相同的。我无法弄清楚 DER 文件是用什么加密编码的,这就是我尝试不同命令的原因。
DER 文件中是否存在错误?或者我命令中的某个地方出错了?
我的最终目标是将 PEM 文件传递-certfile
给smime -sign
答案1
您尝试的这些工具并不是通用的“DER 到 PEM”转换器。它们都适用于非常特定格式的文件,例如,openssl x509
只想获得 X.509 证书,别无其他。但 ASN.1 DER 是一种非常通用的格式(就像 XML 或 JSON 一样);它确实用于 X.509 证书,但它还用于其他数百种不同的东西。
你拥有的文件既不是 X.509 证书,也不是 PKCS#7 消息 – 它是RFC 3125格式,OpenSSL 不知道如何处理。因此,即使您使用 将其转换为 PEM base64 -e
,您的下一个命令仍会因无法识别格式而失败。
(当然可以制作一个工具来转换任何DER 文件转换为 PEM,因为“PEM”格式是字面上地同一 DER 文件的 Base64,当然还有开始/结束标头。但如果它不包含 X.509 证书,那么无论-certfile
格式如何,使用它都是没有意义的。)
我不知道有任何合适的工具可以处理 RFC 3125 签名策略,但从和来看openssl asn1parse
,dumpasn1
该策略似乎包括这些二X.509 证书:
- http://acraiz.icpbrasil.gov.br/credenciadas/RAIZ/ICP-Brasilv5.crt
- http://acraiz.icpbrasil.gov.br/credenciadas/RAIZ/ICP-Brasilv2.crt
最简单的方法是直接从这些 URL 下载单个证书。