使用IP地址和SNI启动https连接

时间:2019-08-13 14:32:59

标签: c++ windows ssl winapi tls1.2

我正在使用WinHttpConnect以便在Windows应用程序和远程服务器之间建立https连接。但是,我的服务器不一定具有DNS地址,因此可以通过将pswzServerName设置为原始IPV4地址来建立连接。

WINHTTPAPI
HINTERNET
WINAPI
WinHttpConnect
(
    IN HINTERNET hSession,
    IN LPCWSTR pswzServerName,
    IN INTERNET_PORT nServerPort,
    IN DWORD dwReserved
);

由于该远程服务器上有多个服务,因此我还需要指定SNI(服务器名称指示),以便TLS握手能够通过。

如何将SNI与IP地址分开传递?

当前,client hello数据包仅在我使用Url打开连接且SNI与URL的连接匹配时才包含SNI(请参见下文)

enter image description here

在OpenSSL中,有一种方法可以在SNI和URL之间进行分隔,而我正在寻找如何在Windows API中做到这一点:

OpenSSL s_client -servername appliance1 -connect 192.0.2.4:443

编辑:

在下面的注释之后,似乎应该在InitializeSecurityContextA之前调用方法WinHttpConnect,并将pszTargetName设置为请求的服务器名称。

但是,如果我希望获得其他参数的默认值该怎么办?

这是我当前的实现,应该如何添加InitializeSecurityContextA才能更改服务器名称。

void connectFunction(std::string server/* can be ip address as well*/ , HINTERNET connectionHandle)
{

   sessionHandle = WinHttpOpen(
        NULL,
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS,
        0
    );

    connectionHandle = WinHttpConnect(sessionHandle, server.c_str(), port, 0); 
    // this will trigger the TLS handshake, and I want to add SNI different than `server` param


0 个答案:

没有答案