以下将https页面与OpenSSL连接的方法似乎适用于大多数页面,而不适用于sheets.googleapis.com。
// initialize OpenSLL
SSL_library_init();
SSL_load_error_strings();
SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
// create context
SSL_CTX_set_ecdh_auto(ctx, 1);
wstring strHostname = L"sheets.googleapis.com";
wstring strPort = L"443";
SOCKET s = http_server_connect(strHostname, strPort);
// make socket non blocking for the timeout
unsigned long mode = 1;
ioctlsocket(s, FIONBIO, &mode);
SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, (int)s);
int res = SSL_ERROR_NONE;
while ((res = SSL_connect(ssl)) != 1)
{
int error = SSL_get_error(ssl, res);
fd_set fds;
FD_ZERO(&fds);
FD_SET(s, &fds);
switch (error)
{
case SSL_ERROR_WANT_READ:
select(int(s + 1), &fds, NULL, NULL, NULL);
break;
case SSL_ERROR_WANT_WRITE:
select(int(s + 1), NULL, &fds, NULL, NULL);
break;
case SSL_ERROR_SYSCALL:
printf("SSL_ERROR_SYSCALL\n");
break;
}
}
运行此代码,第一个SSL_connect
显示预期的SSL_ERROR_WANT_READ
,而第二个调用不显示并且出错。但是,通过检查与Wireshark的连接,您会看到服务器正在重置连接。使用阻塞套接字可以正常工作。
我知道上面的代码回答了一个内容几乎相同的问题,但是由于任何原因,这不适用于google api页面。有没有人暗示如何克服这个问题。
我已经在各种OpenSSL版本(包括最新的1.1.1d)上对其进行了测试
答案 0 :(得分:0)
同时我已经弄清楚了这个问题。我必须通过SSL_set_tlsext_host_name
设置ssl连接的主机名。
有趣的是,此信息似乎已被缓存。稍后删除命令后,代码仍然有效。