SSL_connect(用于sheets.googleapis.com的无阻塞套接字)

时间:2019-11-25 09:58:14

标签: google-api openssl

以下将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)上对其进行了测试

1 个答案:

答案 0 :(得分:0)

同时我已经弄清楚了这个问题。我必须通过SSL_set_tlsext_host_name设置ssl连接的主机名。

有趣的是,此信息似乎已被缓存。稍后删除命令后,代码仍然有效。