提升 Asio 和 OpenSSL 1.1.0

Posted

技术标签:

【中文标题】提升 Asio 和 OpenSSL 1.1.0【英文标题】:Boost Asio and OpenSSL 1.1.0 【发布时间】:2016-05-30 04:42:19 【问题描述】:

我目前正在开发一个 C++ IMAP 库,以便我可以改进一些公认的生锈的 C++ 技能。我想让这个库尽可能地便携,这样我就可以跨操作系统使用它,如果我觉得很疯狂,甚至可以在移动设备上使用。为此,我做了一些研究并决定使用 Boost 的 Asio 库。

我能够让 Boost 自行在我的项目中构建和运行。我向 google.com 做了一个简单的 HTTP GET。不幸的是,我需要能够使用 TLS 进行通信,并且在尝试使用 Asio 的 SSL 功能时遇到了问题。

我使用默认设置从源代码构建了 Boost 和 OpenSSL(所以一切都在 /usr/local 中)。我也在使用 CMAKE 来构建我的项目。以下是我的 CMAKE 文件:

cmake_minimum_required(VERSION 3.2)
project(IMAP)

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11")

message(WARNING "Starting CMAKE...")
set(SOURCE_FILES main.cpp)
add_executable(IMAP $SOURCE_FILES)

find_package(Boost COMPONENTS system thread regex REQUIRED)
message(WARNING "Boost_INCLUDE_DIR: $Boost_INCLUDE_DIR")
message(WARNING "Boost_LIBRARIES: $Boost_LIBRARIES")
message(WARNING "Boost_VERSION: $Boost_VERSION")
include_directories($Boost_INCLUDE_DIR)
target_link_libraries(IMAP $Boost_LIBRARIES)

find_package(OpenSSL REQUIRED)
message(WARNING "OpenSSL_VERSION: $OPENSSL_VERSION")
message(WARNING "OpenSSL_INCLUDE_DIR: $OPENSSL_INCLUDE_DIR")
message(WARNING "OpenSSL_LIBRARIES: $OPENSSL_LIBRARIES")
include_directories($OPENSSL_INCLUDE_DIR)
target_link_libraries(IMAP $OPENSSL_LIBRARIES)

这是我的 CMAKE 消息的输出:

Warning:Starting CMAKE...
Warning:Boost_INCLUDE_DIR: /usr/local/include
Warning:Boost_LIBRARIES: /usr/local/lib/libboost_system.dylib;/usr/local/lib/libboost_thread.dylib;/usr/local/lib/libboost_regex.dylib;/usr/local/lib/libboost_chrono.dylib;/usr/local/lib/libboost_date_time.dylib;/usr/local/lib/libboost_atomic.dylib
Warning:Boost_VERSION: 106100
Warning:OpenSSL_VERSION: 1.1.0
Warning:OpenSSL_INCLUDE_DIR: /usr/local/include
Warning:OpenSSL_LIBRARIES: /usr/local/lib/libssl.dylib;/usr/local/lib/libcrypto.dylib

当我尝试构建项目时,我收到以下一堆错误:

In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:29:
In file included from /usr/local/include/boost/asio/ssl/detail/openssl_init.hpp:100:
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:43:23: error: expected unqualified-id
    mutexes_.resize(::CRYPTO_num_locks());
                      ^
/usr/local/include/openssl/crypto.h:218:41: note: expanded from macro 'CRYPTO_num_locks'
#  define CRYPTO_num_locks()            (0)
                                        ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:29:
In file included from /usr/local/include/boost/asio/ssl/detail/openssl_init.hpp:100:
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:46:66: error: expected unqualified-id
    ::CRYPTO_set_locking_callback(&do_init::openssl_locking_func);
                                                                 ^
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:47:56: error: expected unqualified-id
    ::CRYPTO_set_id_callback(&do_init::openssl_id_func);
                                                       ^
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:64:32: error: expected unqualified-id
    ::CRYPTO_set_id_callback(0);
                               ^
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:65:37: error: expected unqualified-id
    ::CRYPTO_set_locking_callback(0);
                                    ^
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:66:7: error: expected unqualified-id
    ::ERR_free_strings();
      ^
/usr/local/include/openssl/err.h:241:29: note: expanded from macro 'ERR_free_strings'
# define ERR_free_strings() while(0) continue
                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:29:
In file included from /usr/local/include/boost/asio/ssl/detail/openssl_init.hpp:100:
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:68:7: warning: 'ERR_remove_thread_state' is deprecated [-Wdeprecated-declarations]
    ::ERR_remove_thread_state(NULL);
      ^
/usr/local/include/openssl/err.h:244:25: note: 'ERR_remove_thread_state' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(void ERR_remove_thread_state(void *))
                        ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:29:
In file included from /usr/local/include/boost/asio/ssl/detail/openssl_init.hpp:100:
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:72:7: error: expected unqualified-id
    ::EVP_cleanup();
      ^
/usr/local/include/openssl/evp.h:865:25: note: expanded from macro 'EVP_cleanup'
#  define EVP_cleanup() while(0) continue
                        ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:29:
In file included from /usr/local/include/boost/asio/ssl/detail/openssl_init.hpp:100:
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:73:7: error: expected unqualified-id
    ::CRYPTO_cleanup_all_ex_data();
      ^
/usr/local/include/openssl/crypto.h:206:39: note: expanded from macro 'CRYPTO_cleanup_all_ex_data'
# define CRYPTO_cleanup_all_ex_data() while(0) continue
                                      ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:29:
In file included from /usr/local/include/boost/asio/ssl/detail/openssl_init.hpp:100:
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:76:7: error: expected unqualified-id
    ::ENGINE_cleanup();
      ^
/usr/local/include/openssl/engine.h:508:27: note: expanded from macro 'ENGINE_cleanup'
# define ENGINE_cleanup() while(0) continue
                          ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:29:
In file included from /usr/local/include/boost/asio/ssl/detail/openssl_init.hpp:100:
/usr/local/include/boost/asio/ssl/detail/impl/openssl_init.ipp:106:16: error: use of undeclared identifier 'CRYPTO_LOCK'
    if (mode & CRYPTO_LOCK)
               ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:83:31: error: no member named 'SSLv2_method' in the global namespace
    handle_ = ::SSL_CTX_new(::SSLv2_method());
                            ~~^
/usr/local/include/boost/asio/ssl/impl/context.ipp:86:31: error: no member named 'SSLv2_client_method' in the global namespace
    handle_ = ::SSL_CTX_new(::SSLv2_client_method());
                            ~~^
/usr/local/include/boost/asio/ssl/impl/context.ipp:89:31: error: no member named 'SSLv2_server_method' in the global namespace
    handle_ = ::SSL_CTX_new(::SSLv2_server_method());
                            ~~^
/usr/local/include/boost/asio/ssl/impl/context.ipp:111:31: warning: 'TLSv1_method' is deprecated [-Wdeprecated-declarations]
    handle_ = ::SSL_CTX_new(::TLSv1_method());
                              ^
/usr/local/include/openssl/ssl.h:1556:45: note: 'TLSv1_method' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_method(void)) /* TLSv1.0 */
                                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:114:31: warning: 'TLSv1_client_method' is deprecated [-Wdeprecated-declarations]
    handle_ = ::SSL_CTX_new(::TLSv1_client_method());
                              ^
/usr/local/include/openssl/ssl.h:1558:45: note: 'TLSv1_client_method' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_client_method(void)) /* TLSv1.0 */
                                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:117:31: warning: 'TLSv1_server_method' is deprecated [-Wdeprecated-declarations]
    handle_ = ::SSL_CTX_new(::TLSv1_server_method());
                              ^
/usr/local/include/openssl/ssl.h:1557:45: note: 'TLSv1_server_method' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_server_method(void)) /* TLSv1.0 */
                                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:130:31: warning: 'TLSv1_1_method' is deprecated [-Wdeprecated-declarations]
    handle_ = ::SSL_CTX_new(::TLSv1_1_method());
                              ^
/usr/local/include/openssl/ssl.h:1562:45: note: 'TLSv1_1_method' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_1_method(void)) /* TLSv1.1 */
                                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:133:31: warning: 'TLSv1_1_client_method' is deprecated [-Wdeprecated-declarations]
    handle_ = ::SSL_CTX_new(::TLSv1_1_client_method());
                              ^
/usr/local/include/openssl/ssl.h:1564:45: note: 'TLSv1_1_client_method' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_1_client_method(void)) /* TLSv1.1 */
                                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:136:31: warning: 'TLSv1_1_server_method' is deprecated [-Wdeprecated-declarations]
    handle_ = ::SSL_CTX_new(::TLSv1_1_server_method());
                              ^
/usr/local/include/openssl/ssl.h:1563:45: note: 'TLSv1_1_server_method' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_1_server_method(void)) /* TLSv1.1 */
                                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:148:31: warning: 'TLSv1_2_method' is deprecated [-Wdeprecated-declarations]
    handle_ = ::SSL_CTX_new(::TLSv1_2_method());
                              ^
/usr/local/include/openssl/ssl.h:1568:45: note: 'TLSv1_2_method' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_2_method(void)) /* TLSv1.2 */
                                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:151:31: warning: 'TLSv1_2_client_method' is deprecated [-Wdeprecated-declarations]
    handle_ = ::SSL_CTX_new(::TLSv1_2_client_method());
                              ^
/usr/local/include/openssl/ssl.h:1570:45: note: 'TLSv1_2_client_method' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_2_client_method(void)) /* TLSv1.2 */
                                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:154:31: warning: 'TLSv1_2_server_method' is deprecated [-Wdeprecated-declarations]
    handle_ = ::SSL_CTX_new(::TLSv1_2_server_method());
                              ^
/usr/local/include/openssl/ssl.h:1569:45: note: 'TLSv1_2_server_method' has been explicitly marked deprecated here
DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_2_server_method(void)) /* TLSv1.2 */
                                            ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:208:16: error: member access into incomplete type 'SSL_CTX' (aka 'ssl_ctx_st')
    if (handle_->default_passwd_callback_userdata)
               ^
/usr/local/include/openssl/ossl_typ.h:144:16: note: forward declaration of 'ssl_ctx_st'
typedef struct ssl_ctx_st SSL_CTX;
               ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:212:20: error: member access into incomplete type 'SSL_CTX' (aka 'ssl_ctx_st')
            handle_->default_passwd_callback_userdata);
                   ^
/usr/local/include/openssl/ossl_typ.h:144:16: note: forward declaration of 'ssl_ctx_st'
typedef struct ssl_ctx_st SSL_CTX;
               ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:212:22: error: expected ')'
            handle_->default_passwd_callback_userdata);
                     ^
/usr/local/include/boost/asio/ssl/impl/context.ipp:211:53: note: to match this '('
        static_cast<detail::password_callback_base*>(
                                                    ^
/usr/local/include/boost/asio/ssl/impl/context.ipp:214:14: error: member access into incomplete type 'SSL_CTX' (aka 'ssl_ctx_st')
      handle_->default_passwd_callback_userdata = 0;
             ^
/usr/local/include/openssl/ossl_typ.h:144:16: note: forward declaration of 'ssl_ctx_st'
typedef struct ssl_ctx_st SSL_CTX;
               ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:551:18: error: member access into incomplete type 'SSL_CTX' (aka 'ssl_ctx_st')
          handle_->default_passwd_callback,
                 ^
/usr/local/include/openssl/ossl_typ.h:144:16: note: forward declaration of 'ssl_ctx_st'
typedef struct ssl_ctx_st SSL_CTX;
               ^
In file included from /path/to/my/code/JMail/IMAP/main.cpp:4:
In file included from /path/to/my/code/JMail/IMAP/IMAPClient.h:6:
In file included from /path/to/my/code/JMail/IMAP/TLSSocket.h:9:
In file included from /usr/local/include/boost/asio/ssl.hpp:19:
In file included from /usr/local/include/boost/asio/ssl/context.hpp:786:
/usr/local/include/boost/asio/ssl/impl/context.ipp:552:18: error: member access into incomplete type 'SSL_CTX' (aka 'ssl_ctx_st')
          handle_->default_passwd_callback_userdata) ;
                 ^
/usr/local/include/openssl/ossl_typ.h:144:16: note: forward declaration of 'ssl_ctx_st'
typedef struct ssl_ctx_st SSL_CTX;
               ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
10 warnings and 20 errors generated. 

被引用的 TLSSocket 类基本上只是 Boost Asio SSL 示例的包装器:

#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>

void TLSSocket::connect() 
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(this->address, this->port);
    boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
    boost::asio::ssl::context ctx(boost::asio::ssl::context::tlsv1);
    mSocket = new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(io_service, ctx);
    mSocket->set_verify_mode(boost::asio::ssl::verify_peer);
    mSocket->set_verify_callback(boost::bind(&TLSSocket::on_verify_certificate, this, _1, _2));
    boost::asio::async_connect(mSocket->lowest_layer(), iterator,
        boost::bind(&TLSSocket::on_connect, this, boost::asio::placeholders::error));
    io_service.run();


void TLSSocket::disconnect() 
    mSocket->lowest_layer().cancel();


TLSSocket::TLSSocket(std::string address, std::string port) 
    this->address = address;
    this->port = port;
    mSocket = nullptr;


void *TLSSocket::send(IMAPRequest *request) 
    boost::asio::streambuf requestBuff;
    std::ostream request_stream(&requestBuff);
    request_stream << request->getTag() << " " << request->getCommand() << " " << request->getContent() << "\r\n";

    boost::asio::write(*mSocket, requestBuff);

    for (; ;) 
        boost::array<char, 128> buffer;
        boost::system::error_code error;
        size_t len = mSocket->read_some(boost::asio::buffer(buffer), error);

        if (error == boost::asio::error::eof)
            break;
        else if (error)
            throw boost::system::system_error(error);

        std::cout.write(buffer.data(), len);
    


void TLSSocket::on_connect(const boost::system::error_code& error)
    if(!error) 
        try 
            mSocket->async_handshake(boost::asio::ssl::stream_base::handshake_type ::client,
                                     boost::bind(&TLSSocket::on_handshake, this, boost::asio::placeholders::error));
         catch (std::exception ex)
            std::cout << "Handshaking error: " << ex.what() << "\n";
        
     else 
        std::cout << "Connect error: " << error.message() << "\n";
    


void TLSSocket::on_handshake(const boost::system::error_code& error)
    if(!error)

     else 
        std::cout << "Handshaking error: " << error.message() << "\n";
    


bool TLSSocket::on_verify_certificate(bool verified, boost::asio::ssl::verify_context &ctx) 
    char subject_name[256];
    X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
    X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
    std::cout << "Verifying " << subject_name << "\n";

    return verified;

在我看来,它甚至还没有进入编译的链接阶段,它只是试图为我的 main.cpp 制作 .o 文件。如果我在我的 IDE 中打开它抱怨的文件之一,IDE 会给我一个语法错误突出显示,但我不知道为什么。

我是否将包含的顺序错误?我的 CMAKE 文件有问题吗?我是否错误地构建了 OpenSSL 或 Boost?

任何帮助将不胜感激。我已经断断续续地研究了几个星期,并且大部分时间都在构建它(我猜是 C++ 第 1 课 :))。

【问题讨论】:

现在在 OpenSSL 的 RT 上打开...Issue 4547: Changing function CRYPTO_num_locks() to "#define CRYPTO_num_locks() (0)" breaks compiles。项目或许能缓解痛苦;或者他们可能会建议基于版本控制和备用代码路径进行保护。如果 OpenSSL 建议后者,那么您将需要使用 Boost 打开错误报告。由于次要版本颠簸(即 1.0.2 到 1.1.0)上的符号更改,OpenSSL 破坏程序的情况并不少见。他们的治理可能允许这样做,但我没有去寻找政策文档。 我最终回滚到 1.0.2 并且一切正常。谢谢! 现在在 Boost 错误跟踪器中打开...Issue 12238: Boost fails to compile using OpenSSL 1.1.0 【参考方案1】:

在我看来,Boost 尚未更新为可与 OpenSSL 1.1.0 一起使用。 OpenSSL 1.0.2 和 1.1.0 之间有许多 API 更改,它们不完全兼容源代码。我建议您使用 1.0.2,直到 Boost 更新为与新的 OpenSSL 版本一起使用(无论如何它仍处于测试阶段)。

【讨论】:

成功了!你不知道你为我节省了多少时间。非常感谢!

以上是关于提升 Asio 和 OpenSSL 1.1.0的主要内容,如果未能解决你的问题,请参考以下文章

C++ Boost asio (OpenSSL) 获取活动连接的密码和 TLS/SSL 版本

boost::asio::detail::epoll_reactor::start_op的崩溃问题

从套接字和 STDIN 提升 Asio 多线程

提升 Asio Peek 和完成条件

提升 asio 和线程,如果我运行两个实例,我会获得 100% 的 cpu

FOOBAR2000怎样正确安装音频驱动ASIO提升音质