OpenSSL签名验证和证书使用

时间:2014-05-02 15:03:01

标签: openssl digital-signature bouncycastle x509

我正在使用Bouncy Castle java类(1.5)来生成加密/签名的CMS消息。这些将作为电子邮件附件发送 收件人将在解密之前使用Windows上的OpenSSL命令行验证消息。 我遇到了令我惊讶的问题。 Bouncy Castle似乎根本不关心"用法"签名证书上的设置。我正在测试的是客户端和服务器身份验证证书,这显然是不对的。 但是,在验证时,OpenSSL抱怨证书使用不当(在验证时看起来很奇怪(迟到),但没关系) 我收到以下消息: 验证失败24188:错误:2E099064:CMS例程:CMS_SIGNERINFO_VERIFY_CERT:证书验证错误:。\ crypto \ cms \ cms_smime.c:304:验证错误:证书目的不受支持

如果我包含" -no_signer_cert_verify"选项,一切正常(在这种情况下我也不需要包含CA文件)。 OpenSSL文档似乎表明证书使用不受尊重,除非您打开" -purpose"。 所以,我很困惑为什么会出现使用问题,并且不想放弃签名证书的路径验证只是为了解决它。 (使用具有正确用法的证书的显而易见的解决方案听起来很棒,但是,相信我,在这种情况下,我可能并不总是能够强迫它,因为并非这些交换的所有各方都能够可靠地做到这一点)。 那里有什么想法吗?

1 个答案:

答案 0 :(得分:0)

  

然而,在验证时,OpenSSL正在抱怨该证书   用法不合适(这似乎很奇怪(迟到)   验证时间,但没关系)我收到以下消息:   验证失败24188:错误:2E099064:CMS   例程:CMS_SIGNERINFO_VERIFY_CERT:证书验证   错误:。\ crypto \ cms \ cms_smime.c:304:验证错误:不支持   证书目的

这是因为OpenSSL只考虑X.509v3扩展的某些组合对于验证CMS结构是“有效的”:

  • 如果存在Key Usage扩展名,,则必须包含digitalSignature位。
  • 如果存在Extended Key Usage扩展名,,则必须包含email protection OID。

这就是OpenSSL处理扩展的方式;虽然有意义,但这些规则并非任何标准规定。它们属于与证书相关的策略,OpenSSL已选择此非平凡策略作为其默认策略。 Here是一些背景信息和示例代码。您可能希望查看签名/验证必须符合您的情况的政策。