用于asio ssl上下文的单一证书

时间:2017-05-16 10:34:16

标签: c++ ssl boost-asio

我正在使用asio C ++库。在创建SSL服务器套接字时,我有基于示例的以下工作代码,用于指定服务器证书。

http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/ssl/server.cpp

  context_.set_options(
    boost::asio::ssl::context::default_workarounds
    | boost::asio::ssl::context::no_sslv2
    | boost::asio::ssl::context::single_dh_use);
   context_.set_password_callback(boost::bind(&server::get_password, this));
   context_.use_certificate_chain_file("server.pem");
   context_.use_private_key_file("server.pem", boost::asio::ssl::context::pem);
   context_.use_tmp_dh_file("dh512.pem");

是否可以在这里以某种方式使用API​​,而不是像上面那样加载3个文件?

2 个答案:

答案 0 :(得分:2)

不,因为SSL套接字必须具有证书和私钥。您不能只拥有证书,因为您必须使用私钥解密来自客户端的回复。

可能有可能省略服务器上的DH使用情况。 另一个是你可以在同一个文件中同时拥有私钥和证书,如果这是一个关于操作系统要打开多少文件打开查询的问题。但是,我无法想象它对服务器来说很重要的情况。

作为对评论的回复,关于如何将一个文件用于私钥和证书。没有直接的方法可以做到这一点,因为Boost Asio不是加密库,而是网络框架。要做到这一点,你需要使用像OpenSSL或类似的库和类似PKCS#12 archive format之类的东西,你可以在一个文件中有几个对象。使用前者parse the latter。将原始数据从这些对象转发到use_private_keyuse_certificate_chainconst_buffer,格式设置为ASN.1。瞧!无数可维护,难以理解,不必要,但有效。 另一个简单的hacky方法是将两个数据放在PEM包中(一个文件带有私钥和证书PEM编码),而不是手动查找PEM装甲(-----BEGIN...-----END),提取对象数据并将其传递给use_private_keyuse_certificate_chain,相应地将PEM指定为格式。

答案 1 :(得分:1)

事实证明,您只需将私钥放在与证书相同的文件中,并将同一文件传递给两者

context_.use_certificate_chain_file("server.pem");
context_.use_private_key_file("server.pem", boost::asio::ssl::context::pem);

在我的情况下,第三个文件不是必需的。

   context_.use_tmp_dh_file("dh512.pem");