similar questionBoost Asio SSL квитирование никогда не возвращается
Мое дело иное. Я написал 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;
}
В чем может быть причина? Я делаю что-то неправильно?
Я не предоставляю обработчик check_callback, потому что предполагаю, что предварительная проверка, сделанная OpenSSL (потому что везде в boost она говорит, что она вызывает эквивалентную функцию OpenSSL) должно быть достаточно. Есть ли недостаток в нем или это может повлиять на < 1>?
Это тривиальный вопрос, но только для того, чтобы убедиться, что он не вызывает проблем. Как правило, примеры в boost показывают, что объект контекста ssl был задан, прежде чем давать его в ctor
ssl::stream<tcp::socket>
. Я, однако, даю это раньше (в ctor выше), а затем изменяя свойства вconnect()
. Отразится ли это на поведении построенного ssl :: stream (потому что он берет по ссылке, и я надеюсь, что он не сделает никаких копий)?
На стороне записки (если это полезно), я создал CA, CA корневого раздела самозаверяющего PEM сертификат, сертификат сервера, подписанный CA сертификат. Сертификат CA - это то, что я даю load_verify_file(...)
.