SSL_CTX_set_tlsext_servername_callback 函数的调用及设置SSL*的SNI域名。

该代码实现了一个C++函数,用于创建一个使用Boost.ASIO和OpenSSL1.x的SSL/TLS上下文,并特别设置了SNI(服务器名称指示)以便在连接时提供额外的主机名信息。它创建了一个自定义的SSL上下文类,设置了验证模式,并添加了一个回调函数来处理SNI扩展。
摘要由CSDN通过智能技术生成

C/C++ boost::asio::ssl.hpp + openssl 1.x (老版本库)设置SSL/TLS链接对象的 SNI(SSL扩展域名指示额外参数)。

static std::shared_ptr<boost::asio::ssl::context> HttpSslClientContext(const char* host)
{
    class HttpSslContext : public boost::asio::ssl::context
    {
    public:
        HttpSslContext(method m) : context(m) {}

    public:
        std::string host;
    };

    std::shared_ptr<HttpSslContext> ssl_context = make_shared_object<HttpSslContext>(boost::asio::ssl::context::tlsv12_client);
    ssl_context->host = host;
    ssl_context->set_verify_mode(boost::asio::ssl::context::verify_none);
    ssl_context->set_verify_callback(
        [](bool preverified, boost::asio::ssl::verify_context& context)
        {
            return true;
        });

    typedef int(*SSL_CTX_SET_SNI_CALLBACK)(SSL*, int, void*);

    if (NULL != host && *host != '\x0')
    {
        SSL_CTX_SET_SNI_CALLBACK sni = [](SSL* ssl, int /*ad*/, void* arg)
        {
            HttpSslContext* context = static_cast<HttpSslContext*>(arg);
            if (NULL == context)
            {
                return SSL_TLSEXT_ERR_ALERT_FATAL;
            }

            std::string hostname = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
            if (hostname.empty())
            {
                hostname = context->host;
            }

            if (hostname.size() > 0)
            {
                SSL_set_tlsext_host_name(ssl, hostname.data());
            }

            SSL_set_SSL_CTX(ssl, context->native_handle());
            return SSL_TLSEXT_ERR_OK;
        };
        SSL_CTX_set_tlsext_servername_callback(ssl_context->native_handle(), (void(*)())sni);
        SSL_CTX_set_tlsext_servername_arg(ssl_context->native_handle(), ssl_context.get());
    }
    return ssl_context;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值