私の場合は違います。を使用して SSL クライアントを作成しましboost::asio::ssl
たが、現在、他のグループによって開発されているため、テストするサーバーがありません。したがって、現在のサーバーはプレーンな TCP (安全でない) 接続のみを受け入れます。サーバーに対して SSL クライアントを使用すると、ブロッキングhandshake()
がハングアップするか、返されません。ネットで検索したところ、Mozilla にも同様の問題があることがわかりました。SSL をサポートしていないサーバーへの SSL 接続を開始するとハングしましたが、バグは修正されたままです。コーディング エラーがないことを確認するために、コードの一部に説明を追加します。
でctor
:
SecuredConnectionPolicy<ThreadPolicy>::SecuredConnectionPolicy() :
m_sslContext(boost::asio::ssl::context::sslv23),
m_socket(m_ioService, m_sslContext) //ssl::stream<tcp::socket>
{
}
次に、「connect
(...)」が呼び出されたとき:
m_sslContext.set_options(boost::asio::ssl::context::default_workarounds);
m_sslContext.set_verify_mode(
boost::asio::ssl::context::verify_none,
errorCode
);
if(!errorCode)
{
/*m_sslContext.set_verify_callback(
[this](bool bIsPreverificationSuccessful, boost::asio::ssl::verify_context &context){return this->verificationHandler(bIsPreverificationSuccessful, context);},
errorCode
);*/
if(!errorCode)
{
m_sslContext.load_verify_file("newcert.pem", errorCode);
if(!errorCode)
{
m_socket.lowest_layer().connect(remoteEndpoint, errorCode);
if(!errorCode)
{ // ########### Following NEVER RETURNS #############
m_socket.handshake(boost::asio::ssl::stream_base::client, errorCode);
if(errorCode)
{
std::cerr << "Secured Connection Handshake Failed! " << errorCode.message() << std::endl;
}
}
else
{
std::cerr << "Secured Connection Failed! " << errorCode.message() << std::endl;
}
}
else
{
std::cerr << "Secured Connection loading certificate files from default paths Failed! " << errorCode.message() << std::endl;
}
}
else
{
std::cerr << "Registering Verification callback failed! " << errorCode.message() << std::endl;
}
}
else
{
std::cerr << "Secured Connection verify mode Failed! " << errorCode.message() << std::endl;
}
その理由は何ですか?私は何か間違ったことをしていますか?
OpenSSL によって行われる事前検証 (boost のどこでも OpenSSL と同等の関数を呼び出していると言うため) で十分であると想定しているため、verify_callback ハンドラーは提供していません。マイナス面はありますか、それとも <1> に影響しますか?
これは些細なことですが、問題が発生しないことを確認するためのものです。一般に、boost の例では、ssl コンテキスト オブジェクトが ctor of に指定される前に設定されていることが示されています
ssl::stream<tcp::socket>
。ただし、前に(上記のctorで)それを与え、後でプロパティを変更していますconnect()
。これらは、構築された ssl::stream の動作に反映されますか (参照によって取得され、コピーが作成されないことを願っているため)?
余談ですが(役に立つ場合)、CAルートキー、CA自己署名PEM証明書、CA証明書によって署名されたサーバー証明書を作成しました。CA証明書は私が与えるものですload_verify_file(...)
。