2012-05-09 55 views
1

我經歷過的每一個相關的帖子,我可以找到想要去的這條底線,並沒有很清晰的 - 希望有人可以把我從我的痛苦......SSL水管壞了HTTPS調用通過代理

我想通過代理通過HTTPS獲取Android 2.3到POST。這段代碼完全可以在2.2上通過代理完美工作,並且在不通過代理的情況下使用HTTPS在2.2和2.3上完美工作,並且在所有情況下(2.2和2.3),我都可以通過代理通過HTTPS進行GET。它只是2.3 POST使用HTTPS通過代理似乎是問題。我得到了可怕的「破管」錯誤。當我嘗試從連接中讀取輸入流響應時會拋出錯誤 - 大概是因爲TCP套接字已在我的流下關閉。我試過了我能想到的一切,包括使用連接和代理連接頭(設置關閉並保持活動狀態)並設置大的readTimeout數字(30秒)。從我無情的谷歌搜索中,我可以看到Android 2.3上存在已知的SSL問題,但我似乎無法找到任何暗示爲什麼POST可能成爲問題的事情。 Wireshark已經取得了一些成果,但鑑於這是SSL如果只是有點棘手才能解決問題。

有沒有人看起來這樣。我使用HttpsURLConnection作爲各種職位表明這是更穩定的AndroidHttpClient。這裏是我的代碼......任何幫助都是無價的。由於

urlConnection.setSSLSocketFactory(factory);  
urlConnection.setHostnameVerifier(new AllowAllHostnameVerifier()); 

String dateText = "{\"loopParam\":\"" + String.valueOf(d.getHours()) + ":" + String.valueOf(d.getMinutes()) + ":" + String.valueOf(d.getSeconds()) + "\"}"; 
       txtOutput.setText("Sending " +  String.valueOf(dateText.length()) + " bytes of JSON to /pulse/loop"); 

urlConnection.addRequestProperty("Content-type", "application/json"); 
       urlConnection.setDoOutput(true); 
urlConnection.setRequestProperty("Proxy-connection", "Keep-Alive"); 
urlConnection.setRequestProperty("Connection", "Keep-Alive"); 
       urlConnection.setDoInput(true); 
       urlConnection.setUseCaches(false); 
       urlConnection.setReadTimeout(30000); 
       urlConnection.setRequestMethod("POST"); 
       DataOutputStream dataOut = new  DataOutputStream(urlConnection.getOutputStream()); 
       dataOut.writeBytes(dateText); 
       dataOut.flush(); 

BufferedReader bufIn = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
      String sResponse; 
      StringBuilder s = new StringBuilder(); 

     //bufIn is null as error as closed urlcConnection 
      while ((sResponse = bufIn.readLine()) != null) { 
       s = s.append(sResponse); 
      } 

錯誤的詳細信息: 08月 - 12 9時09分51秒SsliferSnifferActivity通過代理連接信息

08-May-12 09:09:54 SsliferSnifferActivity javax.net.ssl.SSLException: Write error: ssl=0x2d42b8: I/O error during system call, Broken pipe 
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method) 
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:837) 
at java.io.OutputStream.write(OutputStream.java:80) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.writeRequestHeaders(HttpURLConnectionImpl.java:799) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1028) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:726) 
at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:110) 
at uk.co.flurrished.sslifersniffer.SslifersnifferActivity.makeRequest(SslifersnifferActivity.java:236) 
at uk.co.flurrished.sslifersniffer.SslifersnifferActivity.access$2(SslifersnifferActivity.java:148) 
at uk.co.flurrished.sslifersniffer.SslifersnifferActivity$2.onClick(SslifersnifferActivity.java:76) 
at android.view.View.performClick(View.java:2485) 
at android.view.View$PerformClick.run(View.java:9080) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3822) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 

編輯:這看起來是由服務器募集400引起的(壞請求)並關閉管道。什麼是關於ANdroid 2.3添加額外的內容時,通過代理,導致400?

+1

與此問題無關,您不應該使用新的AllowAllHostnameVerifier()或者接受任何東西的信任管理器(如果情況也是如此):這會使您的連接容易受到MITM攻擊。 – Bruno

+0

感謝布魯諾,是的,這是我採取的措施,以消除證書問題,但是,不能在生產中使用......謝謝 – MikeB

+0

@MikeB我會提醒你不要在開發中使用它。解決這個問題。我懷疑這些「解決方法」中的許多實際上已經轉移到生產中了。特別是,不正確地驗證主機名是違反HTTPS協議的,並且信任所有證書會導致SSL/TLS協議不安全。 – EJP

回答

1

「斷開的管子」恰好具有一個含義。您已寫入已由另一端關閉的連接。你確定這個同行真的在說SSL嗎?

+0

嗨,是的,因爲外部代理工作正常,並且它在Android 2.2(所有時間,代理或沒有)下工作正常,所以我很高興實現是正確的,只是某事(大概是Android)關閉了管道在POST之後,儘管Keep-Alives。如果是關閉管道的服務器,我們會看到Android 2.2會在代理外發生故障。是否有可能Android 2.3沒有正確設置長度,但是我不明白爲什麼代理會照顧它使用CONNECT? – MikeB

+0

@MikeB我同意,我不明白爲什麼代理會照顧。我無法按照你的評論的其餘部分。 – EJP