我试图在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微秒内)在发送客户机hello后,它将发送到if块5并发送FIN请求,这使我担心如果没有服务器的响应,我无法找到错误,SSL_connect将返回错误。
我评论了如果第5块和测试。令我惊讶的是,由于未调用关机,SSL握手正在发生,而通过TLSv1.2进行的数据传输将持续到最后。这意味着SSL_connect实际上是成功的,但不知怎么的,它正在发生异步。但是以这种方式,我不能报告实际上是否存在SSL握手中的一些错误。
有人能帮我做这件事吗?
它是否真的在异步地进行握手?如果是的话,它为什么会马上返回-1。它不应该等到握手完成后再放-1吗?
发布于 2018-04-20 10:59:21
正如您所提到的,您有非阻塞套接字。在这种情况下,如果SSL_connect() returns -1需要调用SSL_get_error(),检查它返回的是什么SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,然后在检查底层套接字是否准备好使用select()进行读/写之后再次调用SSL_connect()
https://stackoverflow.com/questions/49939135
复制相似问题