ECDSA证书问题提升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::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给出的cipher_list ,则客户端无法连接到服务器,并给出错误"No shared cipher" 。 但是,如果我不给cipher_list那么客户端可以成功连接到服务器。 相同的密码列表与RSA证书正常工作。

相同的ECDSA证书工作正常,如果我使用openssl s_server-cipher选项来提供支持的cipher_list

任何人都可以帮助这个问题?

Solutions Collecting From Web of "ECDSA证书问题提升asio"

没有抱歉的朋友,经过大量的研究,我找到了答案。

问题在于密码列表,而不是代码/证书。

相同的证书使用ECDHE-ECDSA-AES256-SHA密码与openssl客户端服务器,而使用ECDH-ECDSA-AES256-SHA密码进行升级asio SSL客户端服务器。

不管怎样,感谢@rkyser的帮助!

我发现这埋在了openssl-1.0.1源代码的常见问题中:

  • 为什么我无法使用DSA证书与服务器建立SSL连接?

通常情况下,当相同的安装程序与RSA证书正常工作时,您会看到一条消息,指出没有共享密码 。 有两个可能的原因。 客户端可能不支持与DSA服务器的连接,大多数Web浏览器(包括Netscape和MSIE)仅支持连接到支持RSA密码套件的服务器。 另一个原因是一组DH参数没有被提供给服务器。 可以使用dhparam(1)命令创建DH参数,并使用SSL_CTX_set_tmp_dh()加载DH参数,例如:检查apps / s_server.c中s_server的源代码。

所以基于此,请确保您使用SSL_CTX_set_tmp_dh()设置您的DH参数。