SSL_connect成功但返回-1

时间:2018-04-20 10:05:37

标签: c ssl openssl

我试图通过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之前,它是否应该等待握手完成?

1 个答案:

答案 0 :(得分:3)

正如您所提到的,您有非阻塞套接字。在这种情况下,如果SSL_connect() returns -1需要调用SSL_get_error(),请检查它返回SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITE的内容,然后在检查基础套接字准备就绪后再次调用SSL_connect()使用select()

进行读/写