use_certificate_chain_file:系统找不到指定的文件

use_certificate_chain_file: The system cannot find the file specified

提问人:AES 提问时间:8/28/2023 最后编辑:AES 更新时间:8/28/2023 访问量:62

问:

我正在尝试使用 boost::asio 创建一个接受器,它是 openssl 的包装器。但是我在尝试设置证书链文件和私钥文件时遇到错误

操作系统: Windows 编译器:MSVC 我正在将 vcpkg 用于 boost 和 openssl,但是我在另一个目录中安装了另一个 openssl 1.1.1(未在编译中使用)。我在与openssl相关的任何目录中都没有找到任何配置文件。我尝试了很多方法来解决这个问题,包括阅读有关此主题的所有其他帖子,但没有机会,并花了将近一个月的时间试图解决这个问题。我还查找了 boost 的包装器实现,但仍然找不到原因。

Acceptor::Acceptor(asio::io_service &ios, unsigned short port_num)
    : m_ios(ios),
      m_acceptor(m_ios,
                 asio::ip::tcp::endpoint(
                     asio::ip::address_v4::any(),
                     port_num)),
      m_ssl_context(asio::ssl::context::sslv23_server)
{
    // Setting up the context.
    m_ssl_context.set_options(
        boost::asio::ssl::context::default_workarounds | 
        boost::asio::ssl::context::no_sslv2 |
        boost::asio::ssl::context::single_dh_use);
    m_ssl_context.set_password_callback(
        [this](std::size_t max_length,
               asio::ssl::context::password_purpose purpose)
            -> std::string
        { return get_password(max_length, purpose); });
    // to find default location
    const char* dir;
    m_ssl_context.set_default_verify_paths();
    dir = X509_get_default_cert_dir();
    puts(dir);
    dir = X509_get_default_private_dir();
    puts(dir);
    try {
        m_ssl_context.load_verify_file("SomePath/server.crt"); // makes no difference
        m_ssl_context.use_certificate_chain_file("server.crt");
        m_ssl_context.use_private_key_file("server.key",
            asio::ssl::context::pem);
        m_ssl_context.use_tmp_dh_file("dh512.pem");
    }
    catch (system::system_error err) {
        std::cout << err.what() << std::endl;
    }
    m_acceptor.listen();
}

这是我的输出,直到这个函数结束。

输出:SomePath/certs SomePath/私有 use_certificate_chain_file:系统找不到指定的文件 [system:2]

注意:此处的 SomePath 与上面的代码相同。

编辑正如我所提到的,可以使用以下方法解决无法找到文件的问题:

    try {
        m_ssl_context.load_verify_file("SomePath1/server.crt");
        m_ssl_context.use_private_key_file("SomePath2/server.key", asio::ssl::context::pem);
        m_ssl_context.use_tmp_dh_file("SomePath3/dh1024.pem");
        m_ssl_context.use_certificate_chain_file("SomePath1/server.crt");
        m_ssl_context.use_private_key_file("SomePath2/server.key",
            asio::ssl::context::pem);
        m_ssl_context.use_tmp_dh_file("SomePath3/dh1024.pem");
    }
    catch (system::system_error err) {
        std::cout << err.what() << std::endl;
    }

请注意,现在我正在使用 dh1024,因为 512 很久以前就被剥夺了。 同样,“SomePathi”应该是一回事。 最后,这仅用于测试,像这样硬编码不是一个好的做法。

C++ SSL Boost OpenSSL ASIO

评论

0赞 273K 8/28/2023
您似乎没有考虑当前的工作目录。
0赞 AES 8/28/2023
我也试过了,但没有用。我把这些证书放到任何地方。出于某种原因,我发现了这个问题,我应该这样做。OpenSSL有一些奇怪的事情。当我从 C++ 内部查找默认配置路径时(使用 ),它为我提供了其他已安装的 openssl 的位置,但是当我查找默认证书路径时,它为我提供了 vcpkg 安装的 openssl 相关位置。m_ssl_context.use_certificate_chain_file("SomePath/server.crt")CONF_get1_default_config_file()

答: 暂无答案