【问题标题】:Ignore common name when verifiying certificate in openssl在 openssl 中验证证书时忽略公用名
【发布时间】:2020-03-25 18:42:20
【问题描述】:

我们正在编写一个新的服务器/客户端应用程序,需要在 OpenSSL 1.1.0 中验证自签名证书,其中 CN 字段并不重要。

我尝试了以下操作,但似乎没有效果:

X509_VERIFY_PARAM *param = NULL;
param = SSL_get0_param(sslo.ssl);
X509_VERIFY_PARAM_set1_host(param, nullptr, 0);

如何有效地忽略此字段的所有验证?

Shane 回答后更新:

我尝试使用 SSL_CTX_set_verify 设置 verify_callback 。 在回调中,我调用了 X509_STORE_CTX_get_error_depth 。生成的错误代码是 X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT,根据文档,这意味着“通过的证书是自签名的,并且在受信任的证书列表中找不到相同的证书。”

这个错误非常笼统,与 CN 无关,如果我只将证书中的 CN 字段更改为适当的值,它就不会发生。

【问题讨论】:

    标签: c++ security openssl


    【解决方案1】:

    使用SSL_CTX_set_verify 调用来指定您自己的验证回调函数,您可以在其中对证书进行任何您想要的操作。

    仔细阅读该页面,它应该会告诉您您需要了解的所有内容,该页面还包含一个示例,如果您愿意,您可以将其作为处理程序的基础。

    【讨论】:

    • 我试过了,问题出在那个回调上,当我调用 X509_STORE_CTX_get_error_depth 我得到错误代码:X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 这是一个非常普遍的错误,并不特定于 CN
    • 它告诉您提供的证书是自签名证书。默认情况下,它不允许这样做。如果你想允许,你可以在回调函数中覆盖它,只需将 preverify_ok 设置为 0 并返回。通过这样做,您将接受任何自签名证书,因此您的安全性几乎为零,因为任何人都可以生成自签名证书并将其呈现给您的客户。您可以检查“特定”自签名证书,这取决于您。只需将 preverify_ok 设置为 0 并返回即可接受任何状态下的任何证书...
    • 正如我所说,请仔细阅读链接页面,它确实会告诉您您需要知道的一切。
    • 感谢 Shane,我已经彻底阅读了该手册页。显然,我不希望对等方出示随机证书并被允许连接。我有一个自签名证书列表,我想针对它们验证对等证书,但不关心发行者或 CN。我将如何成功地做到这一点?
    • 如果您在“控制”服务器,我会创建自己的 CA 证书,然后创建服务器发出的证书。然后,您可以在您的客户端上使用只有您的 ca 证书的 calist。这样一来,您只有在使用您控制的 ca 提供证书时才信任服务器。
    猜你喜欢
    • 2019-12-27
    • 2011-01-16
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2011-11-16
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多