【问题标题】:OpenSSL - SSL_write problemOpenSSL - SSL_write 问题
【发布时间】:2011-08-27 22:08:06
【问题描述】:

我用 C 语言编写了一个小 HTTPS 客户端,但我遇到了 SSL_write 函数的问题。 三个测试来说明我的问题:

#define HEADERS1 "GET / HTTP/1.1\r\n"
#define HEADERS2 "Host: www.example.com\r\n"
#define HEADERS3 "User-Agent: OpenSSL\r\n"
#define HEADERS4 "\r\n"

#define HEADERS "GET / HTTP/1.1\r\nHost: www.example.com\r\nUser-Agent: OpenSSL\r\n\r\n"

测试 1:

SSL_write(ssl,HEADERS,strlen(HEADERS));

成功:服务器正确返回带有 HTTP/1.1 200 代码的 /index.html 资源。

测试 2:

SSL_write(ssl,HEADERS1,strlen(HEADERS1));
SSL_write(ssl,HEADERS2,strlen(HEADERS2));
SSL_write(ssl,HEADERS3,strlen(HEADERS3));
SSL_write(ssl,HEADERS4,strlen(HEADERS4));

失败:服务器没有返回任何东西。所有 SSL_write 函数都不会返回 ERROR,但我的应用程序被锁定在 SSL_read 上,因为目标服务器没有提供任何内容......也没有标题:(

测试 3:

SSL_write(ssl,HEADERS1,strlen(HEADERS1));
SSL_write(ssl,HEADERS2,strlen(HEADERS2));
SSL_write(ssl,HEADERS4,strlen(HEADERS4));

成功:服务器正确返回带有 HTTP/1.1 200 代码的 /index.html 资源。

我可以调用 SSL_write 发送标头的次数是否有特别限制?很奇怪……

非常感谢!


好的,我的问题仍然存在,但我有更多细节:

IISS-SSL => 所有测试成功。

Apache-SSL => 所有测试成功。

Nginx-SSL => 所有测试成功。

LightHTTPD-SSL => 测试 2 失败。

我不明白为什么只有 LightHTTPD 不明白我的请求...

【问题讨论】:

  • 也许在调试的情况下运行服务器并查看日志可能会有所帮助。您也可以尝试捕获流量(wireshark 可以解密,如果提供了服务器密钥)。
  • 您还应该检查SSL_write 可能返回的错误。
  • 谢谢 n.m.问题已解决。问题是来自 LightHTTPD (redmine.lighttpd.net/issues/2197) 的错误,它存在于旧版本中...

标签: c openssl


【解决方案1】:

对于 SSL_Write() 操作,正确的方法应该是在 SSL_Write 调用之后,检查返回的消息。如果是 SSL_WANT_READ,则给它一点时间来读取。

通过检查返回值进行连续写入操作可能会成功,但这并不安全,因为您无法确定您写入的数据是否已到达服务器并且服务器会完全读取它。

这反过来可能会影响其他 SSL_write 操作。

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 1970-01-01
    • 2019-03-28
    • 2016-11-07
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多