Linux 通过ECDSA证书颁发增强asio
我正在使用boost::asio实现SSL服务器 上下文初始化如下面的代码所示Linux 通过ECDSA证书颁发增强asio,linux,boost,ssl,openssl,boost-asio,Linux,Boost,Ssl,Openssl,Boost Asio,我正在使用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::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());
}
使用ECDSA
证书如果我使用上面给出的cipher\u list
,则客户端无法连接到服务器,并给出错误“无共享密码”
。但是如果我没有给出密码列表
,那么客户端可以成功连接到服务器。同样的密码列表适用于RSA
证书
如果我使用openssl s_server
和-cipher
选项来提供支持的cipher_列表
有人能帮我解决这个问题吗?我在openssl-1.0.1源代码的常见问题解答中发现了这一点:
- 为什么我不能使用DSA证书与服务器建立SSL连接
因此,基于此,请确保您正在使用
SSL\u CTX\u set\u tmp\u DH()
不,抱歉,伙计,我在大量研究后找到了答案
问题在于密码列表,而不是代码/证书
同一证书对openssl客户端服务器使用ECDHE-ECDSA-AES256-SHA
密码,而对boost asio SSL客户端服务器使用ECDH-ECDSA-AES256-SHA
密码
无论如何,谢谢@rkyser的帮助 尝试设置密码列表时,
SSL\u CTX\u set\u cipher\u list
返回什么?在OpenSSL中,DSA和ECDSA证书是两种不同的证书类型。事实上,他的代码可能同时适用于RSA和DSS(DSA)。他将使用SSL\u CTX\u set\u tmp\u ecdh
,而不是SSL\u CTX\u set\u tmp\u dh
。无论如何,s_客户端
不应该像MSIE或Netscape那样遭受痛苦。我只是想插话说声谢谢你发布这些信息,rkyser和@jww都是如此。这些文档太让人困惑了,让我觉得我需要使用tmp_dh回调,而不是tmp_ecdh回调。回过头来看,这对我来说应该是显而易见的,因为ecdh!=卫生署。有趣的是,无数的谷歌搜索都没有发现关于tmp_ecdh的任何信息,甚至连一点提示都没有。这句话就是它,它帮了大忙。再次感谢,为什么会这样?ECDHE和ECDH是不同的密码,不是吗?
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