2011-08-27 81 views
2

我使用C一點HTTPS客戶端和我與SSL_write功能的問題。 三個測試來說明我的問題:OpenSSL的 - 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函數不返回錯誤,但我的應用程序在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發送頭?很奇怪的次數特別的限制......

非常感謝你 !


好了,我的問題persits,但我有更多的細節:

IISS-SSL =>所有測試成功。

Apache的SSL =>所有測試成功。

Nginx的-SSL =>所有測試成功。

LightHTTPD-SSL =>試驗2故障。

我不明白爲什麼只有LightHTTPD不明白我的請求......

+0

也許有助於調試運行服務器並查看日誌。您也可以嘗試捕獲流量(如果與服務器密鑰一起提供,wireshark可以解密它)。 –

+0

你也應該檢查'SSL_write'可能返回的錯誤。 –

+0

謝謝你。問題解決了。問題來自LightHTTPD(http://redmine.lighttpd.net/issues/2197),這在舊版本中存在一個錯誤... – Ruby14000

回答

1

對於SSL_Write()操作,正確的做法應該是SSL_Write通話後,檢查返回的消息。如果它是SSL_WANT_READ,則給它少量的時間讓它讀取。

做連續寫操作檢查返回值可能是成功的,但它是不是安全的,因爲你不會相信你寫的達到了服務器和服務器完整閱讀數據。

這反過來可能會影響其他SSL_write操作。