我正在使用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个文件?
答案 0 :(得分:2)
不,因为SSL套接字必须具有证书和私钥。您不能只拥有证书,因为您必须使用私钥解密来自客户端的回复。
可能有可能省略服务器上的DH使用情况。 另一个是你可以在同一个文件中同时拥有私钥和证书,如果这是一个关于操作系统要打开多少文件打开查询的问题。但是,我无法想象它对服务器来说很重要的情况。
作为对评论的回复,关于如何将一个文件用于私钥和证书。没有直接的方法可以做到这一点,因为Boost Asio不是加密库,而是网络框架。要做到这一点,你需要使用像OpenSSL或类似的库和类似PKCS#12 archive format之类的东西,你可以在一个文件中有几个对象。使用前者parse the latter。将原始数据从这些对象转发到use_private_key
和use_certificate_chain
到const_buffer
,格式设置为ASN.1
。瞧!无数可维护,难以理解,不必要,但有效。
另一个简单的hacky方法是将两个数据放在PEM包中(一个文件带有私钥和证书PEM编码),而不是手动查找PEM装甲(-----BEGIN...
,-----END
),提取对象数据并将其传递给use_private_key
,use_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");