Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 通过ECDSA证书颁发增强asio_Linux_Boost_Ssl_Openssl_Boost Asio - Fatal编程技术网

Linux 通过ECDSA证书颁发增强asio

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服务器

上下文初始化如下面的代码所示

    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连接
通常情况下,您会看到一条消息,说明当 同样的设置适用于RSA证书。有两个 可能的原因。客户端可能不支持到DSA服务器的连接 大多数web浏览器(包括Netscape和MSIE)只支持 与支持RSA密码套件的服务器的连接。另一个原因 是指尚未向服务器提供一组DH参数。DH 可以使用dhparam(1)命令创建参数,并使用 SSL_CTX_set_tmp_dh()例如:在 例如apps/s_server.c


因此,基于此,请确保您正在使用
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