【问题标题】:SSL_read not receivingSSL_read 未接收
【发布时间】:2016-02-01 18:37:24
【问题描述】:

我正在尝试通过 SSL 连接到安全服务,但是在以下代码中,SSL_read 永远不会返回,如果服务器不返回任何消息,这当然是正常行为,我正在尝试的服务器然而,connect to 应该返回某种消息。下面有什么不能读的吗?

//Initialize SSL library
OpenSSL_add_ssl_algorithms();
//Initialize Crypto algorithms
OpenSSL_add_all_algorithms();

//Create new SSL context accepting SSL V2, V3 or TLS V1.0, V1.1 and V1.2
const SSL_METHOD *method = SSLv23_client_method();
SSL_CTX *ctx = SSL_CTX_new(method);
if (ctx == NULL)
{
    printf("Error initializing SSL context.\n");
    return 0;
}
SSL *ssl = SSL_new(ctx);
//Create socket descriptor
int sd = 0;
//Create hints for connection
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;//Can be both IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
struct addrinfo * result;
//Get address info, this could potentially return multiple
int err = getaddrinfo("api.okcoin.com", "9880", &hints, &result);
if (err != 0)
{
    printf("Could not get addr info.\n");
    return 0;
}
//Try connecting to any of the returned addresses
struct addrinfo * res;
for (res = result; res != NULL; res = res->ai_next)
{
    sd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (sd == -1)
    {
        printf("Could not connect to host.\n");
        return 0;
    }
    if (connect(sd, res->ai_addr, res->ai_addrlen) == 0)
    {
        //Socket is now connected, free addrinfo results
        freeaddrinfo(result);
        //Assign socket descriptor to SSL
        if (SSL_set_fd(ssl, sd) == 0)
        {
            printf("Could not assign socket descriptor.\n");
            return 0;
        }
        //Begin SSL-handshake
        if(SSL_connect(ssl) == 0)
        {
            printf("Could not perform handshake.\n");
            return 0;
        }
        break;
    }
}
//Could not connect socket, free addrinfo results and return error
if (res == NULL)
{
    printf("Could no connect to to any host.\n");
    freeaddrinfo(result);
    return 0;
}
printf("Connected.\n");

SSL_write(ssl, "HELLO\x01", 6);
char * m = malloc(8192);
SSL_read(ssl, m, 8192);

【问题讨论】:

  • @sigvardsen “消息”的定义是什么?是什么让“HELLO”成为服务器将响应的消息? (它怎么知道消息不是“HELLO WORLD”,而且它还没有收到所有消息,所以它正在等待消息?)
  • @sigvardsen 向我们展示固定代码。如果您向我们展示不应该工作的代码,我们将无法修复它。
  • @sigvardsen:您仍然只发送“HELLO”,因为您将“5”作为大小。应为“6”以包含 \x01。
  • @sigvardsen 我有一个明显的印象,即您没有向我们展示足够真实的代码,使我们无法找到真正的问题。考虑到您必须更改它的次数,并且更改的次数正是会导致您报告的问题的原因,这个问题似乎与我们在您不会向我们展示的代码。 (投票结束,因为不包括重现问题所需的代码。)
  • @sigvardsen 因为你不会给我看真正的代码,我所能做的就是随机猜测你的真实代码有什么问题。我会尝试另一个:您是否绝对、100% 确定这是第一个挂起的此连接的 SSL_read 呼叫?

标签: c sockets openssl


【解决方案1】:

由于没有错误检查,您无法知道SSL_write() 是否成功,更不用说为什么SSL_read() 会阻塞。任何时候都无法编写这样的代码,更不用说在处理网络或 SSL 时了。

使用等效的 Java 程序得到的是不受信任的服务器证书错误。当我修复该问题时,我会在 60 秒后收到读取超时。

我的结论是,这里有问题的不是你的代码,而是请求格式。

【讨论】:

  • 如果此答案正确甚至有用,您应该说明正确的请求格式是什么,以方便未来的读者。否则这个问题在这里毫无价值,应该被删除。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2019-03-26
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多