2017-05-16 59 views
0

我正在使用asio C++库。在创建SSL服务器套接字时,我具有以下基于示例的工作代码来指定服务器证书。与asio 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个文件如上?

回答

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"); 
2

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

可能有可能忽略你的服务器上的DH使用。 另一个问题是,如果是关于向操作系统发送多少个文件打开查询的问题,您可以将私钥和证书都放在同一个文件中。但是,我无法想象它对服务器有什么影响的情况。

作为回复评论,关于如何使用一个文件私有密钥和证书。有没有直接的方法来做到这一点,因为Boost Asio不是一个加密库,而是一个网络框架。要做到这一点,你需要使用像OpenSSL或类似的库,如PKCS#12 archive format,其中你有一个文件中有几个对象。前者使用parse the latter。将原始数据从这些对象中移出至use_private_keyuse_certificate_chainconst_buffer,格式设置可能为ASN.1。瞧!数千倍的可维护性,难以理解,不必要的,但工作。 另一个琐碎的方法是将两个数据都放在PEM捆绑包中(一个文件带有私钥和证书PEM编码),然后手工找到PEM护甲(-----BEGIN...,-----END),提取对象数据并将其传递给use_private_key,use_certificate_chain相应地将PEM指定为格式。

+0

嗨,我不明白如何使用API​​,如果我们有私钥和证书在同一个文件 – tech74