我正在使用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(请参见下文)
在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