我试图通过TLSv1.2进行https连接。上下文创建,一切都很好,我没有包含在下面的代码中。
if(https) //block 1
{
int ssl_err = 0;
int ssl_rc = 0;
ssl_fd = SSL_new(ctx); /* create new SSL connection state */
if(ssl_fd) //block 2
{
printf("Failure in SSL state creation.");
ssl_err = -1;
}
if(ssl_err == 0) //block 3
{
SSL_set_fd(ssl_fd, fd); /* attach the socket descriptor */
ERR_clear_error();
ssl_rc = SSL_connect(ssl_fd); /* perform the connection*/
printf("Failure in SSL connection %d returned.\n", ssl_rc);
if ( ssl_rc == -1 ) //block 4
ssl_err = -1;
}
if ( ssl_err == -1 ) //block 5
{
printf("Failure in SSL connection.\n");
SSL_free(ssl_fd);
shutdown(fd, 2);
abort();
}
}
在上面的代码中,它显示输出为
SSL连接失败-1返回 SSL连接失败。
我检查过数据包文件。在发送客户端问候之后立即(在200微秒内),它将转到第5块并发送一个FIN请求,让我担心找到我无法在没有服务器响应的情况下发生的错误,SSL_connect正在返回错误。
我评论了第5块并进行了测试。令我惊讶的是,由于没有调用关机,SSL握手正在发生,TLSv1.2上的数据传输一直持续到最后。这意味着SSL_connect实际上是成功的,但不知怎的,它发生了异步。但是通过这种方式,我无法报告SSL握手中是否存在错误。
任何人都可以帮我解决这个问题吗? 它是否实际异步进行握手?如果是的话,为什么它会立即返回-1。在放-1之前,它是否应该等待握手完成?
答案 0 :(得分:3)
正如您所提到的,您有非阻塞套接字。在这种情况下,如果SSL_connect() returns -1
需要调用SSL_get_error()
,请检查它返回SSL_ERROR_WANT_READ
或SSL_ERROR_WANT_WRITE
的内容,然后在检查基础套接字准备就绪后再次调用SSL_connect()
使用select()