openssl cms-验证不';不能使用外部证书工作

openssl cms-验证不';不能使用外部证书工作,openssl,cryptography,signing,smime,Openssl,Cryptography,Signing,Smime,我已经对此进行了几天的研究,最后我提出了一个简单的测试用例。我需要签名并验证SMIME/CMS格式文件的签名,该文件不得包含证书 签名可以很好地工作,但是只有当证书嵌入到签名文件中并且允许openssl使用它时,验证才能工作。如果我不包括证书,或者如果我告诉openssl忽略它,验证就会失败,即使我在这两种情况下都显式地指定了签名者证书和CA证书 我有以下文件: ca crt.pem——ca证书 服务器crt.pem–我用于签名的证书 服务器密钥.pem–服务器的私钥 sample.xml–我

我已经对此进行了几天的研究,最后我提出了一个简单的测试用例。我需要签名并验证SMIME/CMS格式文件的签名,该文件不得包含证书

签名可以很好地工作,但是只有当证书嵌入到签名文件中并且允许openssl使用它时,验证才能工作。如果我不包括证书,或者如果我告诉openssl忽略它,验证就会失败,即使我在这两种情况下都显式地指定了签名者证书和CA证书

我有以下文件:

  • ca crt.pem
    ——ca证书
  • 服务器crt.pem
    –我用于签名的证书
  • 服务器密钥.pem
    –服务器的私钥
  • sample.xml
    –我要签名的示例文件
步骤1:生成签名文件:

$ openssl cms -sign -signer server-crt.pem -inkey server-key.pem -nodetach -md sha256 -in sample.xml -outform der -out sample.cms-der -noattr
请注意,我没有要求openssl排除该证书。在最终版本中,我还必须添加
-nocerts
,但现在,如果我们将其保留在其中,测试就更容易了

步骤2:使用嵌入式证书验证签名

好的,现在我们在
sample.cms der
中有了签名文件–首先让我们使用签名文件中包含的证书来验证它:

$ openssl cms -verify -CAfile ca-crt.pem -inform der -signer server-crt.pem -in sample.cms-der
Verification successful
步骤3阿尔法:忽略嵌入证书验证签名

现在让我们要求openssl忽略嵌入在签名文件中的证书–我使用的是完全相同的命令行,只是在末尾添加了
-nointern
选项:

$ openssl cms -verify -CAfile ca-crt.pem -inform der -signer server-crt.pem -in sample.cms-der -nointern
Verification failure
14712:error:2E09D08A:CMS routines:CMS_verify:signer certificate not found:.\crypto\cms\cms_smime.c:333:
当然,在这种情况下,我仍然可以验证签名,因为证书包含在内–但是如果我使用
-nocerts
选项生成签名文件,那么无论我是否使用
-nointern
验证,我最终都会进入失败情况

第3步测试版:SMIME而不是CMS

我还尝试使用smime而不是cms,有趣的是,尽管错误消息相同,但错误号不同,并且来自源代码中的不同部分:

$ openssl smime -verify -CAfile ca-crt.pem -inform der -signer server-crt.pem -in sample.cms-der -nointern
Verification failure
13580:error:2107C080:PKCS7 routines:PKCS7_get0_signers:signer certificate not found:.\crypto\pkcs7\pk7_smime.c:466:

我正在使用的openssl版本是2017年12月7日的openssl 1.0.2n

我正在调查的问题是更大背景的一部分,事实证明,我在这个特定测试用例中遇到的问题相当愚蠢:我使用了错误的参数来表示签名证书。在验证时不应该使用
-signer
来表示签名证书,而是
-certfile

$ openssl cms -verify -CAfile ca-crt.pem -inform der -certfile server-crt.pem -in sample.cms-der -nointern
Verification successful
它也适用于SMIME:

$ openssl smime -verify -CAfile ca-crt.pem -inform der -certfile server-crt.pem -in sample.cms-der -nointern
Verification successful
我通常会完全删除这个问题,但也许将来有人会发现这很有用