OpenSSL签名验证和证书使用

OpenSSL签名验证和证书使用,openssl,digital-signature,bouncycastle,x509,Openssl,Digital Signature,Bouncycastle,X509,我使用Bouncy Castle java类(1.5)生成加密/签名的CMS消息。这些将作为电子邮件附件发送。 收件人将在解密之前使用Windows上的OpenSSL命令行验证消息。 我遇到了一个令我吃惊的问题。 Bouncy Castle似乎根本不关心签名证书上的“用法”设置。我正在测试的是客户端和服务器身份验证证书,这显然是不对的。 然而,在验证时,OpenSSL抱怨证书使用不当(在验证时获得证书似乎很奇怪(很晚),但没关系) 我得到以下信息: 验证失败24188:错误:2E099064:C

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

如果我包括“-no\u signer\u cert\u verify”选项,则一切正常(在这种情况下,我也不需要包括CAfile)。 OpenSSL文档似乎表明证书的使用是不受尊重的,除非您打开“-purpose”。 所以,我对为什么会出现使用问题感到困惑,我不想仅仅为了避开它而放弃签名证书的路径验证。(通过正确使用证书的显而易见的解决方案听起来不错,但是,相信我,在这种情况下,我可能并不总是能够强制这样做,因为不是所有参与这些交换的各方都能够可靠地做到这一点)。 有什么想法吗

但是,在验证时,OpenSSL抱怨证书 用法不当(这似乎很奇怪(很晚) 验证时间,但不要紧)我收到以下消息: 验证失败24188:错误:2E099064:CMS 例程:CMS\u签名信息\u验证\u证书:证书验证 错误:。\crypto\cms\cms\u smime.c:304:验证错误:不支持 证书用途

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

  • 如果存在
    密钥用法
    扩展名,则它必须包含
    数字签名
  • 如果
    扩展密钥用法
    扩展存在,则它必须包括
    电子邮件保护
    OID

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

如果您展示相关的Bouncy Castle代码,人们可能会帮助您解决一些问题。你可能应该把它分成几个问题。在这里询问Bouncy Castle编程问题;并询问OpenSSL命令在上的用法。已在另一块板上解决。必须使用“-purpose any”选项强制接受证书而不使用“电子邮件签名”。这允许删除“-no\u signer\u cert\u verify”,因此我继续获得证书的路径验证