【问题标题】:OpenSSL Differentiating Trusted CA Certificates From Self-Signed OnesOpenSSL 区分可信 CA 证书和自签名证书
【发布时间】:2016-01-22 15:31:10
【问题描述】:

我目前正在为现有应用程序开发身份验证插件。根据协议,插件应允许仅由受信任的 CA 签名的证书。所有自签名证书都应该被认为是无效的。我生成了一个自签名证书,也有一个由受信任机构签名的证书。我还实现了两个不同的函数来验证自签名证书和可信证书以用于测试目的。

我的问题是,应该验证受信任证书的功能也会验证我的自签名证书。下面你可以看到我的实现:

FILE* certificate_file = fopen("cert.cer", "r");
X509* certificate = PEM_read_X509(certificate_file, NULL, NULL, NULL);

X509_STORE* store = X509_STORE_new();
X509_STORE_CTX* ctx = X509_STORE_CTX_new();

X509_STORE_add_cert(store, certificate);
X509_SORE_CTX_init(ctx, store, certificate, NULL);

X509_verify_cert(ctx);

我错过了什么?有人说证书链,但在大多数示例中,参数只是NULL。还有一些其他的实现,但它们要么太复杂,要么不能真正回答我的问题。

为避免任何误解,我希望此函数在输入自签名证书时返回无效。

【问题讨论】:

  • 您是否可以选择以编程方式运行 openssl 二进制文件?您需要的一切都可以通过命令行实现。
  • 那我猜我们可以将shell命令传递给一些函数?我还不确定,因为我处于插件的最开始,但现在似乎是一个选项。

标签: c++ authentication openssl cryptography


【解决方案1】:

您似乎缺少的是受信任证书存储的概念。受信任的存储包含您明确信任的证书。现在,如果您仅使用根证书(例如,从浏览器的信任库中获取)创建一个,则只有具有中间 CA 证书和您自己的证书的链将被信任。由于您的自签名证书不在信任库中,因此它不会被信任,因为链的大小只有 1 个证书,并且不会返回到信任库。

因此,您将维护两个信任库:一个用于您的测试环境,使用自签名证书,另一个用于您的实际部署,使用根或中间 CA 证书来验证您的最终用户证书。

【讨论】:

  • 我相信这里有一个小小的误解。我不希望我的自签名证书被接受为有效。我希望我的函数在给出自签名证书时返回无效。但是,当我使用自签名证书时,此函数返回有效。
  • 我看不出有什么误解。如果您不想验证您的自签名证书是否有效,请不要将其添加到信任库中。验证证书链时,您必须验证链中的一个证书是否属于特定信任库(即仅包含您明确信任的证书的证书库)。我想你可能错过了最后一步。
  • 我明白了,您建议我删除“X509_STORE_add_cert(store, certificate)”部分。在这种情况下,它实际上返回无效。我想我现在需要做的就是找到一种将受信任的证书添加到存储中的方法。
  • 通常您在磁盘上创建一个 (PKCS#12) 存储并加载它,而不是在您的代码中创建它。然后使用 CLI 工具来维护存储。如果您只想信任一个 CA 根证书,那么您的存储中只包含该证书(直到在前一个 CA 根证书即将到期或被撤销时颁发新的 CA 根证书)。
  • 这是客户端-服务器系统的常用方法吗?我犹豫的是,这个插件将用于 peer-2-peer 系统。既然没有应用服务器,那么在每个客户端中存储仍然是一种有效的方法吗?
猜你喜欢
  • 2016-05-20
  • 1970-01-01
  • 2020-07-30
  • 2012-04-10
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多