4

目前我正在处理这个:

...
    ctx.use_certificate_chain_file("./C/cert.pem");
    ctx.use_private_key_file("./C/key.pem", boost::asio::ssl::context::pem);
    ctx.load_verify_file("./C/ca.pem");
...

到目前为止一切正常,但我真正需要做的是加载相同的 key.pem 但带有密码短语,查看 asio 文档发现ssl::context::set_password_callback根据信息调用SSL_CTX_set_default_passwd_cb并允许处理加密的 PEM文件,请记住,我更熟悉 python 等高级语言,所以 c++ 不是我的强项

任何帮助表示赞赏,谢谢!

4

1 回答 1

5

您应该熟悉来自 python 的回调。

首先定义回调函数:

using namespace boost::asio;

// this function is called to obtain password info about an encrypted key
std::string my_password_callback(
    std::size_t max_length,  // the maximum length for a password
    ssl::context::password_purpose purpose ) // for_reading or for_writing
{
    std::string password; 
    // security warning: !! DO NOT hard-code the password here !!
    // read it from a SECURE location on your system
    return password;
}

然后设置回调set_password_callback()

// set the callback before you load the protected key
ctx.set_password_callback(my_password_callback);
// ...
// this will call my_password_callback if a password is required
ctx.use_private_key_file("key.pem",ssl::context::pem);

如果你想使用一个类方法作为回调,

class server {
    std::string password_callback(); //NOTE: no parameters
    // ...
};

您可以使用boost::bind()设置回调:

#include <boost/bind.hpp>

void server::startup() {
    ctx_.set_password_callback(
        boost::bind(&server::password_callback,this) );
    // ...
}

在任何一种情况下,如果无法解密密钥,将抛出boost::system::system_error异常(基于std::exception),可能是因为密码错误或找不到文件。

于 2012-12-21T08:53:12.600 回答