OpenSSL 区分受信任的 CA 证书和自签名证书

OpenSSL Differentiating Trusted CA Certificates From Self-Signed Ones

我目前正在为现有应用程序开发身份验证插件。根据协议,插件应允许 仅由受信任的 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。还有其他一些实现,但它们要么太复杂,要么没有真正回答我的问题。

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

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

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