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

OpenSSL Differentiating Trusted CA Certificates From Self-Signed Ones

本文关键字:证书 CA 信任 OpenSSL      更新时间:2023-10-16

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

为了避免任何误解,我希望这个函数在给出自签名证书作为输入时返回invalid。

您似乎忽略了可信证书存储的概念。可信存储区包含您显式信任的证书。现在,如果你只创建一个根证书(例如,从浏览器的信任存储中获取),只有中间CA证书和你自己的证书链将被信任。由于您的自签名证书不在信任存储库中,因此它将不受信任,因为该链只有一个证书大小,并且它不会导致返回信任存储库。

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