如何使用 boost 和 openssl 验证 ssl 证书

问题描述 投票:0回答:1

我需要将数据推送到服务器,并且数据需要安全地传输。

我正在使用 lib boost。

// The SSL context is required, and holds certificates
ssl::context ctx(ssl::context::tlsv13_client);

我遇到的问题是

ctx.set_default_verify_paths();
不验证我想要将数据传输到的服务器的证书。但是,当您使用浏览器导航到服务器时,它工作正常,无需用户信任证书。这意味着它是由受信任的实体生成的。

我成功地使用了

ctx.load_verify_file("cert-chain.pem");
但我使用的时候却不起作用
ctx.load_verify_file("cert.pem");

我进一步挖掘,发现该证书是中级证书...... 这就是为什么 boost (在底层依赖 openssl)无法验证证书。 但是浏览器如何验证证书??

我已经开始实现我的自定义验证过程,但由于我的代码是开源的,我认为实现验证是没有意义的。因为有人可以读取代码并生成具有正在验证的值的证书。


ctx.set_verify_callback(std::bind(&custom_verify_callback, std::placeholders::_1, std::placeholders::_2));

[...]

bool custom_verify_callback(bool preverified, boost::asio::ssl::verify_context& ctx)
{
    // Perform your custom verification logic here
    X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
    // Example: Check if the certificate is issued by a trusted CA
    // This is a simplistic example and may not cover all verification requirements
    if (preverified && cert != nullptr)
    {
        // Check if the certificate is issued by a trusted CA
        // You may need to implement more complex logic here depending on your requirements
        // For example, checking if the intermediate certificate is present in the chain
        // or verifying the hostname
        // Example: Check the issuer of the certificate
        X509_NAME* issuer = X509_get_issuer_name(cert);
        if (issuer != nullptr)
        {
            // Compare the issuer name with your trusted CA's name
            // For simplicity, this example assumes a specific issuer name
            if (X509_NAME_cmp(issuer, "") == 0)
            {
                return true;
            }
        }
    }
    return false;
}
c++ ssl boost https openssl
1个回答
0
投票

这意味着它是由受信任的实体生成的。

关键部分是:哪个可信实体。这些被称为 CA(证书颁发机构),您的浏览器有一个它们的列表,可以(并且通常)与您操作系统的受信任 CA 列表分开。

专有应用程序最典型的做法是嵌入/分发您自己的受信任 CA 列表(通常只有 1 个)。因此,您可以确保您的应用程序信任服务器的证书颁发者,而不是依赖操作系统的列表。

我成功地使用了

ctx.load_verify_file("cert-chain.pem"); 

你就是这么做的

但是当我使用时它不起作用

ctx.load_verify_file("cert.pem");

那是因为如果无法验证链的根(根CA)。您也许可以使用

set_verify_depth
来解决这个问题,但验证整个链似乎很自然。

我进一步挖掘,发现该证书是一个中间证书...这就是为什么 boost(在底层依赖于 openssl)无法验证该证书。但是浏览器如何验证证书??

因为它在自己的证书存储中拥有整个链。请注意,浏览器有额外的验证(如证书吊销列表和额外的黑名单)。

我已经开始实现我的自定义验证过程,但由于我的代码是开源的,我认为实现验证是没有意义的。因为有人可以读取代码并生成具有正在验证的值的证书。

openssl 中实现的检查也是如此。防范有针对性的黑客攻击与验证网络上的服务器完全不同。通过强化您的系统来防范此类攻击(例如,确保您的自定义证书存储不会被篡改)。最明显的解决方案是进行权限分离(如果攻击者可以操纵您正在运行的代码,则您的系统已经受到损害)。另一种典型的方法是检测这种篡改,例如通过使用签名的二进制文件(取决于您的平台支持)。

© www.soinside.com 2019 - 2024. All rights reserved.