3

我正在使用 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证书。

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

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

4

2 回答 2

2

不抱歉,经过大量研究,我找到了答案。

问题出在密码列表而不是代码/证书上。

相同的证书将ECDHE-ECDSA-AES256-SHA密码与 openssl 客户端服务器一起使用,而将ECDH-ECDSA-AES256-SHA密码用于提升 asio SSL 客户端服务器。

无论如何感谢@rkyser 的帮助!

于 2013-10-07T08:00:53.277 回答
1

我发现这隐藏在 openssl-1.0.1 源代码的常见问题解答中:

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

通常,当相同的设置适用于 RSA 证书时,您会看到一条消息说没有共享密码。有两个可能的原因。客户端可能不支持与 DSA 服务器的连接大多数 Web 浏览器(包括 Netscape 和 MSIE)仅支持与支持 RSA 密码套件的服务器的连接。另一个原因是没有向服务器提供一组 DH 参数。DH 参数可以使用 dhparam(1) 命令创建,并使用 SSL_CTX_set_tmp_dh() 加载,例如:在 apps/s_server.c 中检查 s_server 的源以获取示例。

因此,基于此,请确保您使用SSL_CTX_set_tmp_dh().

于 2013-10-04T15:57:58.090 回答