2017-01-02 41 views
3

我在Android中使用DownloadManager服務通過https URL下載文件,例如https://www.antennahouse.com/XSLsample/pdf/sample-link_1.pdf。這些文件沒有(當前)密碼保護,以防有什麼區別。爲什麼https下載暫停PAUSED_WAITING_TO_RETRY?

一旦我排隊下載請求,下載管理器開始下載,但它似乎掛起。當我檢查狀態,我得到

COLUMN_BYTES_DOWNLOADED_SO_FAR: 0 
COLUMN_STATUS: 4 
COLUMN_REASON: 1 

COLUMN_STATUS 4 STATUS_PAUSED,「當下載等待重試或恢復。」

COLUMN_REASON 1 PAUSED_WAITING_TO_RETRY,「當下載被暫停,因爲發生一些網絡錯誤,下載管理器是重試之前等待的請求。」但似乎沒有辦法確定發生了什麼網絡錯誤。下載從未成功完成。

我已經檢查了logcat監視器的相關警告和錯誤,但什麼都沒發現。

我已經嘗試過使用多個不同的服務器,無論是在公司內部還是在公共場合,都有相同的結果。

沒有明顯的網絡問題:在Wi-Fi連接起來,並使用HTTP下載://工作就好:文件被下載立即出現,並在指定的目標文件系統。

在https下載的情況下,我們的服務器日誌顯示,從服務器的角度來看,文件正在成功服務。在筆記本電腦上的瀏覽器中測試相同的https URL會導致文件成功下載,而不會在開發人員工具網絡面板中顯示任何明顯的問題或額外的協商。

我的代碼(總結):

sManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 
DownloadManager.Request req = new DownloadManager.Request(sourceURI); 
final Uri destinationUri = Uri.fromFile(destinationFile); 
req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI 
      | DownloadManager.Request.NETWORK_MOBILE) 
     .setDestinationUri(destinationUri) 
     .setMimeType(...); 

long id = sManager.enqueue(req); 

摘要:一個HTTPS下載通過下載管理器開始無限期掛起,而相同的HTTPS下載在瀏覽器中正常工作,並且普通HTTP下載使用做工精細用相同的應用程序下載管理器。我有最好的線索是PAUSED_WAITING_TO_RETRY表示「發生了一些網絡錯誤。」我如何確定網絡錯誤是什麼?

+2

您確定URL的SSL證書是由Android所信任的CA頒發的嗎? –

+1

在Android上,實際下載的組件[似乎使用'HttpURLConnection'](https://android.googlesource.com/platform/packages/providers/DownloadProvider/+/master/src/com/android/providers /downloads/DownloadThread.java)。您可以使用'HttpURLConnection'(或修改[我的一個]](https://github.com/commonsguy/cw-omnibus/tree/v8.1/Service/Downloader)將一個快速和骯髒的應用程序混合在一起)以及看看你得到了什麼。我同意Prera​​k,這感覺就像一個SSL握手問題。 – CommonsWare

+0

@Prera​​kSola:好問題。我會研究它。 – LarsH

回答

0

最近的原因似乎是一個CertificateException:CertPathValidatorException:Trust anchor for certification path not found.我發現了這個出來using an HttpURLConnection directly(感謝@CommonsWare的建議),而不是DownloadManager,它允許更直接的訪問異常。 (對於我們的內部服務器,情況是這樣的,似乎並不是我提到的示例URL,它似乎與DownloadManager有同樣的問題......但也許同樣的問題有一個不同的問題原因。)

根CA(在所有情況下)是「AddTrust External CA Root」,它位於設備的可信CA列表中,位於設置>安全性>可信憑證下。因此,如果這是一個可信CA根,爲什麼會出現「找不到證書路徑的信任錨」異常?

看起來有一箇中間CA沒有被包含在服務器所提供的鏈中,如described here。實際上,使用openssl s_client -connect來檢查CA鏈確認不包含中間CA.Android doc article提出了兩種可能的解決方案:將中間CA包含在服務器鏈中,或通過創建特殊的TrustManager在應用程序中明確信任它們。我希望做前者。

+0

P.S.確認診斷和修復(包括服務證書鏈中的中間CA)。在服務器上進行更改後,問題消失了。 – LarsH