正常:瀏覽器發送到我的代理:「CONNECT ... \ r \ n \ r \ n」,代理髮送「200 OK \ r \ n \ r \ n」,瀏覽器發送加密的請求,代理調用SSL_accept(套接字)。好。openssl接受連接使用我的緩衝區
問題:瀏覽器發送到我的代理服務器:「CONNECT ... \ r \ n \ r \ n」+下一個加密的請求。代理髮送「200 OK \ r \ n \ r \ n」,調用SSL_accept(套接字)返回SSL_ERROR_SSL或SSL_ERROR_SYSCALL,因爲代理讀取加密請求的緩衝區部分。
解決方案:
使用的recv(襪子,BUF,BUFFER_SIZE,MSG_PEEK)和recv(襪子,BUF,used_size,0)。問題:所有數據將被讀取,或池()中的無限信號。
如何調用SSL_accept()使用我的緩衝區加密數據的一部分?
任何解決方案?
解決方案是修復越野車客戶端。在嘗試協商TLS之前,客戶端必須等待代理建立連接併發送「200 ok ...」。客戶的代碼被破壞了。 –
不要在空白行後面讀取任何內容,即使這意味着您必須一次讀取一個字節:性能在這裏並不重要。並確保在建立上行連接之前不發送200 OK。 – EJP
@SamVarshavchik該錯誤在代理端。客戶端可以在收到'200'回覆之前發送數據。這在[CONNECT'規範]的[第3.3節「數據管道」](https://tools.ietf.org/html/draft-luotonen-web-proxy-tunneling-01#section-3.3) https://tools.ietf.org/html/draft-luotonen-web-proxy-tunneling-01)。代理不應該首先調用'SSL_accept()',因爲它不是TLS握手的目標。它應該將原始數據原樣傳遞給下一臺服務器。 –