【问题标题】:OpenSSL and CAPI - collisions in certificatesOpenSSL 和 CAPI - 证书冲突
【发布时间】:2018-08-22 13:48:37
【问题描述】:

我遇到了与 OpenSSL 的 CAPI 引擎发生冲突的问题:在正常情况下,我可以使用存储在我的智能卡上的私钥来使用 OpenSSL 建立 SSL 连接。简化代码:

    EVP_PKEY pkey = ENGINE_load_private_key(my_engine, subject_name, 0, 0);
    void * pdata = my_certificate_context.pbCertEncoded;
    X509 * cert = d2i_X509(0, &pdata, my_certificate_context.cbCertEncoded);
    SSL_CTX_use_certificate(my_ssl_context, cert);
    SSL_CTX_use_private_key(my_ssl_context, pkey);

但是,有一个问题:如果碰巧我有多个具有给定主题名称的证书,CAPI 引擎将选择其中一个证书,它是否选择正确的证书取决于运气。对我来说幸运的是,它选择了错误的那个,这样就提醒了我这个问题。查看源代码,CAPI 引擎似乎支持更复杂的密钥搜索方案,因此我可以指定主题名称应该在特定的证书存储中找到。因为我有正确的 PCCERT_CONTEXT,所以我可以轻松获得证书存储的名称,但我不知道如何告诉 CAPI 引擎使用该证书存储。这里的文档非常粗略,我找不到一个例子。我希望它可以使用 FENGINE_ctrl_cmd_string 来完成,但我不知道该怎么做。谁能帮帮我,好吗?

【问题讨论】:

    标签: ssl openssl certificate collision


    【解决方案1】:

    经过大量研究和测试,我可以得出结论,可以使用 ENGINE_ctrl_cmd_string 更详细地指定证书的位置:

    if (!ENGINE_ctrl_cmd_string(Engine, "store_name", "MY", 0)) printf("Failed!");
    if (!ENGINE_ctrl_cmd_string(Engine, "store_flags", "1", 0)) printf("Failed!");
    

    第一行告诉 CAPI 引擎使用不同的证书存储(在本例中为“MY”,但可以使用任何其他存储,例如“ROOT”)。第二行指示引擎使用本地计算机存储而不是当前用户存储。

    但是:

    1) 这两个值对于引擎来说都是全局的。如果需要使用具有不同设置的多个同时连接,则每个连接必须具有单独的引擎。与网上写的相反,可能使用 SSL_CTX_set_client_cert_engine 功能。在这种情况下,您不需要将引擎设置为默认引擎。 (注意:如果我为两个同时连接使用具有不同设置的两个引擎,我需要对实际发生的情况进行一些测试。到目前为止,它看起来会起作用,但我不确定。)

    2) 无法指定其他商店位置,例如当前服务商店。这将需要更新 CAPI 引擎。

    3) 无法使用更精确的标识来指定证书,例如通过指定哈希或序列号。

    4) 无论如何指定证书是没有意义的,因为 SSL 引擎会忽略这样的规范(实际上任何使用 SSL_CTX_use_certificateSSL_CTX_use_PrivateKey 函数完成的事情)。相反,当执行握手时,它将打开命令字符串指定的存储并搜索由服务器选择的 CA 签名的证书。我不确定如果找到多个此类证书会发生什么,我怀疑会向用户显示一个对话框。无论如何,不​​可能通过代码选择特定的证书,除非你想修改引擎的插件。 (注意:如果您打算在服务器端使用证书,则情况可能并非如此。)

    5) 使用函数 SSL_CTX_use_certificateSSL_CTX_use_PrivateKey 不仅没有意义,而且实际上很危险,因为后者将选择第一个匹配的证书(例如,使用相同的主题名称)在存储中并使用它,而不管颁发 CA 或其他任何东西。

    此信息对 OpenSSL 的 1.0.2 分支有效。我没有对较新或较旧的分支进行任何测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多