Вам не нужно устанавливать блокировки потоков в OpenSSL 1.1.0 и более поздних версиях. В FAQ по OpenSSL об этом сказано:
Является ли OpenSSL поточно-ориентированным?
Да, но с некоторыми ограничениями;Например, SSL-соединение не может использоваться одновременно несколькими потоками. Это справедливо для большинства объектов OpenSSL.
Для версии 1.1.0 и новее больше ничего делать не нужно.
Для более ранних версий, чем 1.1.0, это необходимо для вашего приложениянастроить функции обратного вызова потока. Для этого ваше приложение должно вызвать CRYPTO_set_locking_callback (3) и один из CRYPTO_THREADID_set ... API. Для получения дополнительной информации см. Справочную страницу по потокам OpenSSL и «примечание о многопоточности» в файле INSTALL в исходном дистрибутиве.
Пока вы не разделяете объекты SSL между несколькими потоками, вам следуетхорошо.
Ниже приведены некоторые другие мысли по поводу вашего примера кода:
void startup()
{
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_ssl_algorithms();
ERR_load_crypto_strings();
}
void shutdown()
{
ERR_free_strings();
EVP_cleanup();
}
void thread_shutdown()
{
CRYPTO_cleanup_all_ex_data();
}
Вам не нужно совершать какие-либо из вышеуказанных вызовов. Это загадочный код запуска и завершения работы, который вы должны были сделать в OpenSSL 1.0.2. В OpenSSL 1.1.0 этого не требуется - он запускается и выключается автоматически. Единственное, что вам может понадобиться вызвать - это OPENSSL_thread_stop()
в вашей функции thread_shutdown()
при определенных обстоятельствах (но, вероятно, нет). См .:
https://www.openssl.org/docs/man1.1.1/man3/OPENSSL_thread_stop.html
auto ssl_ctx_options = SSL_OP_SINGLE_DH_USE || SSL_OP_NO_SSLv3;
Нет необходимости использовать SSL_OP_SINGLE_DH_USE
. Он ничего не делает в OpenSSL 1.1.0 (это требуется только для 1.0.2 или более ранней версии).
SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_NONE, nullptr);
Попробуйте вместо этого использовать SSL_VERIFY_PEER
, который прервет рукопожатие, если сертификат партнера не может быть проверен.