2012-07-02 527 views
0

我有一個openssl客戶端說話ssl。客戶以前曾經與openssl服務器交談過,一切都很好,很花哨。我們現在用java重寫服務器,我們看到下面的情況。SSL_read第二次失敗

1)連接到服務器WORKS

2)握手WORKS

3)第一請求WORKS

4)第一響應WORKS

5)第二請求WORKS

6 )第二回應失敗

7)第三次要求EST WORKS

8)第三響應失敗

的第二響應是有關加密130bytes和(應該是)周圍100字節加密。客戶端成功讀取了tcp套接字中的所有130個字節,但在將SSL_read(如第1個響應)扔出後,它僅輸出1個字節。調用SSL_get_error後沒有錯誤...只有1個字節被成功返回。我叫SSL_pending直接事後並返回0

第三響應現在返回-1 SSL_ERROR_SSL「解密失敗或不良記錄MAC」

我是全新的,以OpenSSL和我一直都爭奪這個問題了幾個小時現在。任何想法,將不勝感激

UPDATE:相關代碼

... 
BIO* bio = BIO_new_mem_buff(sbuf, bufoutlen); 
BIO_set_mem_close(bio,BIO_NOCLOSE); 
ssl->rbio=bio; 
int len = SSL_read(ssl, bufout, sbuflen); //<<return 1 even though buf has 130bytes 
printf("pending=%d\n",SSL_pending(ssl)); //<<returns 0 

回答

1

你依靠的東西,你不能依賴。 Java可能會將響應緩存到其SSL層,這會導致接收到不同長度的SSL消息。您不能依賴任何通過SSL或TCP讀取的長度,它們是字節流協議,對於至少在API級別的SSL而言。你必須循環閱讀,直到你有你需要的一切。

+0

我很清楚數據包的碎片,這不是它。 –

+0

@justonemailjustonemail我沒有說任何關於數據包碎片的事情。考慮到你提出這個問題,你無法確定什麼是,哪些不是答案。這是你的代碼不起作用,不是我的。 – EJP