OpenSSL - SSL_write问题

时间:2011-08-27 22:08:06

标签: c openssl

我在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 ressource。

测试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 ressource。

我可以调用SSL_write发送标头的次数有特殊限制吗?很奇怪......

非常感谢你!


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

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

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

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

LightHTTPD-SSL =>测试2失败。

我不明白为什么只有LightHTTPD不理解我的要求......

1 个答案:

答案 0 :(得分:1)

对于SSL_Write()操作,正确的方法应该是在SSL_Write调用之后,检查返回的消息。如果它是SSL_WANT_READ,那么请给它一些少量的时间来阅读。

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

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