我正在使用 boost::asio 实现 SSL 服务器。
上下文初始化如下代码所示
boost::asio::ssl::context_base::method SSL_version =
static_cast<boost::asio::ssl::context_base::method>(param_values[ID_PROTOCOL_VERSION].int32_value);
// load certificate files
boost::shared_ptr<boost::asio::ssl::context> context_ = boost::shared_ptr<boost::asio::ssl::context>(
new boost::asio::ssl::context(SSL_version));
p_ctx = boost::static_pointer_cast<void>(context_);
context_->set_options(boost::asio::ssl::context::default_workarounds);
context_->use_certificate_chain_file(cert_chain_file);
context_->use_certificate_file(cert_file, boost::asio::ssl::context::pem);
context_->use_private_key_file(cert_file, boost::asio::ssl::context::pem);
context_->set_verify_mode(boost::asio::ssl::verify_peer | boost::asio::ssl::verify_fail_if_no_peer_cert);
context_->set_verify_callback(boost::bind(&verify_certificate_cb, _1, _2));
if (param_values[ID_CIPHER_LIST].int32_value != 0)
{
std::string cipher_list = "";
generate_cipher_list(param_values[ID_CIPHER_LIST].int32_value, cipher_list);
MA5G_logger::log(PRIORITY_INFO, "Supported cipher list %s", cipher_list.c_str());
SSL_CTX_set_cipher_list((reinterpret_cast<boost::asio::ssl::context*>(p_ctx.get()))->native_handle(),
cipher_list.c_str());
}
在cipher_list
中,我支持下面的列表
AES128-SHA:AES256-SHA:AES128-SHA256:AES256-SHA256:AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA
使用 ECDSA
证书,如果我使用上面给出的 cipher_list
,则客户端无法连接到服务器并给出错误 “No shared cipher”
。但是,如果我不提供 cipher_list
,则客户端可以成功连接到服务器。相同的密码列表适用于 RSA
证书。
如果我将 openssl s_server
与 -cipher
选项一起使用以提供支持的 cipher_list
,则相同的 ECDSA 证书工作正常>
谁能帮忙解决这个问题?
最佳答案
不抱歉,伙计,经过大量研究我找到了答案。
问题出在密码列表上,而不是代码/证书上。
同一证书使用 ECDHE-ECDSA-AES256-SHA
密码和 openssl 客户端服务器,同时使用 ECDH-ECDSA-AES256-SHA
密码用于 boost asio SSL 客户端-服务器。
无论如何感谢@rkyser 的帮助!
关于linux - 使用 ECDSA 证书问题 boost asio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18929049/