similar questionSSLハンドシェイクを返すことはありません
私の場合は異なっています。 boost::asio::ssl
を使用して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によって行われた事前検証(どこでも、それがOpenSSL同等の機能を呼び出すと言っているので)で十分であると仮定しているので、verify_callbackハンドラを提供していません。そこに何か欠点がありますか?これは<に影響を与えますか?
これは些細なことですが、問題が発生しないことを確認するだけです。一般的に、ブーストでは、sslコンテキストオブジェクトが
ssl::stream<tcp::socket>
のctorで与えられる前に設定されています。私はしかし、前に(上記のctorで)それを与えて、後でconnect()
のプロパティを変更しています。これらは、構築されたssl :: streamの動作に反映されるでしょうか?(これは参照によるもので、コピーを作成しないことを望むからです)
私はCAルートキー、CA自己署名PEM証明書、CA証明書で署名されたサーバー証明書を作成しました。 CA証明書は私がload_verify_file(...)
に与えているものです。