2

現在、boost asio で RESTful API を設定しています。

クライアントからの接続は、HTTP 経由で正常に機能します。しかし、HTTPS 経由で接続しようとすると、サーバー側で「共有暗号がありません」というエラーが表示されます。エラーはopensslの実装に起因しているようですが、どうすればよいかわかりません。私の最初の推測は、暗号アルゴリズムが設定されていないということですが、asioでこれを行う方法がわかりません。

これは私がコードに入れたもので、エラーが発生する場所です:

auto acceptHandler = boost::bind(&self::onAccept, this, connection,
                                 boost::asio::placeholders::error);
connection->async_accept(m_acceptor, acceptHandler);

m_sslContext.set_options(
        context::default_workarounds | context::no_sslv2 | context::single_dh_use);
m_sslContext.use_certificate_file(filename, context::pem);
m_sslContext.use_private_key_file(filename, context::pem);

誰もこれを以前に持っていた、または機能させたことがありますか?

4

3 に答える 3

5

私は同じ問題を抱えていて、この方法で解決しました。サーバーの秘密鍵と証明書ファイルを生成する必要があります。その手順は次のとおりです。

// Generate a new ssl private key :
$openssl genrsa -out privkey.pem 1024

// Create a certificate signing request using your new key
$openssl req -new -key privkey.pem -out certreq.csr

// Self-sign your CSR with your own private key:
$openssl x509 -req -days 3650 -in certreq.csr -signkey privkey.pem -out newcert.pem

// Install the signed certificate and private key for use by an ssl server
// This allows you to use a single file for certificate and private key
$( openssl x509 -in newcert.pem; cat privkey.pem ) > server.pem

// If you use a dh temp file :
$openssl dhparam -outform PEM -out dh512.pem 512

次に、server.pemおよびdh512.pemファイルをサーバー実行ディレクトリにコピーします。

tmp dh ファイルを使用する場合は、次のコード行も追加する必要がありますm_sslContext.use_tmp_dh_file("dh512.pem");

于 2012-09-19T10:18:38.023 に答える
1

@asiocity が指摘しているように、重要な部分は、ssl::stream を初期化する前にssl::contextを完全に構成することです。

ssl::context が完全に設定されるまで ssl::stream を延期しながら、両方を初期化リストで初期化するのは困難です。

私が使用する 1 つの方法は、ssl::stream が初期化される前に、ssl::context をサブクラス化し、コンストラクターをオーバーライドして、イニシャライザー リストで完全に構成できるようにすることです。

例えば

class server_context : public boost::asio::ssl::context {
  public: server_context(boost::asio::ssl::context::method m, std::string certfile);
};

...

server_context::server_context(boost::asio::ssl::context::method m, std::string certfile)
: boost::asio::ssl::context(m)
{
  use_private_key_file(certfile);
  use_certificate_chain_file(certfile);
}

...

class myclass {
  private:
    server_context : ssl_context_;
    boost::asio::ssl::stream<boost::asio::ip::tcp::socket&> stream_;
  public:
    myclass(boost::asio::ip::tcp::socket&, std::string certfile);

...

myclass::myclass(std::string certfile) 
: ssl_context_(boost::asio::ssl::context::sslv23, certfile),
  stream_(socket, ssl_context_) 
{
  ...
}

ただし、shared_ptrを回避するには多くの作業が必要なようです

サブクラスではなくカスタム初期化子リストだけでこれを行うことができるコンストラクターミックスイン/テンプレートのトリックを望んでいます/望んでいます。

于 2015-10-14T12:16:19.287 に答える