2017-05-16 13 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"); 

上記のように3つのファイルをロードするとは対照的に、ここでは単一の証明書で何とかAPIを使用することが可能ですか?

答えて

1

それはあなただけの両方

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

3番目のファイルに同じファイルを証明書と同じファイル内の秘密鍵を入れて渡す必要が判明私の場合には必要ありません。

context_.use_tmp_dh_file("dh512.pem"); 
2

いいえ、SSLソケットには証明書と秘密鍵が必要です。秘密鍵を使用してクライアントからの応答を復号化する必要があるため、証明書を持つことはできません。

サーバー上でDHの使用を省略する可能性があります。 もう1つは、OSにファイルを開くクエリの件数に関する質問であれば、秘密鍵と証明書の両方を同じファイルに入れることができるということです。しかし、私はそれがサーバーにとって重要な状況をイメージすることはできません。

秘密鍵と証明書の両方に1つのファイルを使用する方法に関するコメントへの返信として。 Boost Asioは暗号ライブラリではなく、ネットワークフレームワークなので、これを行うには簡単な方法はありません。これを行うには、OpenSSLまたは類似のライブラリのようなものと、PKCS#12 archive formatのようなものを採用する必要があります。そこには、1つのファイルに複数のオブジェクトがあります。前者はparse the latterにしてください。これらのオブジェクトの生データをuse_private_keyuse_certificate_chainconst_bufferに転送し、フォーマットはおそらくASN.1に設定します。そしてボイル!何千分も少ない保守性があり、理解しにくく、不要であるが、機能する。 PEM防具(-----BEGIN...-----END)を手作業で見つけて、オブジェクトデータを抽出し、これをuse_private_keyuse_certificate_chainに渡すよりも、PEMバンドル(秘密鍵と証明書PEMで暗号化された1つのファイル)に両方のデータを入れてください対応してフォーマットとしてPEMを指定する。

+0

こんにちは、秘密鍵と証明書が同じファイルにある場合、私はAPIを使用する方法がわかりませんでした – tech74