我經歷過的每一個相關的帖子,我可以找到想要去的這條底線,並沒有很清晰的 - 希望有人可以把我從我的痛苦......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?
與此問題無關,您不應該使用新的AllowAllHostnameVerifier()或者接受任何東西的信任管理器(如果情況也是如此):這會使您的連接容易受到MITM攻擊。 – Bruno
感謝布魯諾,是的,這是我採取的措施,以消除證書問題,但是,不能在生產中使用......謝謝 – MikeB
@MikeB我會提醒你不要在開發中使用它。解決這個問題。我懷疑這些「解決方法」中的許多實際上已經轉移到生產中了。特別是,不正確地驗證主機名是違反HTTPS協議的,並且信任所有證書會導致SSL/TLS協議不安全。 – EJP