提问人:AES 提问时间:8/28/2023 最后编辑:AES 更新时间:8/28/2023 访问量:62
use_certificate_chain_file:系统找不到指定的文件
use_certificate_chain_file: The system cannot find the file specified
问:
我正在尝试使用 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”应该是一回事。 最后,这仅用于测试,像这样硬编码不是一个好的做法。
答: 暂无答案
评论
m_ssl_context.use_certificate_chain_file("SomePath/server.crt")
CONF_get1_default_config_file()