2017-01-02 30 views
3

私はのようなhttps URLでファイルをダウンロードするために、AndroidのDownloadManagerサービスを使用しています。このファイルは、(現在)パスワードで保護されているわけではありません。httpsのダウンロードがPAUSED_WAITING_TO_RETRYで一時停止するのはなぜですか?

ダウンロード要求をエンキューすると、DownloadManagerがダウンロードを開始しますが、ハングアップしているようです。私は状態を確認すると、私はCOLUMN_STATUS 4

COLUMN_BYTES_DOWNLOADED_SO_FAR: 0 
COLUMN_STATUS: 4 
COLUMN_REASON: 1 

を得る「ダウンロードが再試行または再開を待っているとき。」、STATUS_PAUSEDですネットワークエラーが発生し、ダウンロードマネージャが要求を再試行する前に待機しているため、ダウンロードが一時停止されたときに ""と表示されます。しかし、がどのようなネットワークエラーが発生したかは、と判断する方法がないようです。ダウンロードは正常に完了しません。

私は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のダウンロードは、ブラウザで正常に動作、およびプレーンHTTPのダウンロードが使用して同じアプリで正常に動作しながら、httpsのダウンロードは、無期限DownloadManagerがハング経由で開始しましたダウンロードマネジャー。私が持っている最高の手がかりは、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.私は(提案のため@CommonsWareに感謝)の代わりに、例外へのより直接的なアクセスを与えたDownloadManager、using an HttpURLConnection directlyことで、これを見つけました。 (これは私たちの社内サーバーの場合にも当てはまりました。私が言及したサンプルURLでは、DownloadManagerで同じ問題が発生しているようには見えませんでしたが、同じ問題がルート証明機関(すべての場合)は、[設定]> [セキュリティ]> [信頼された資格情報]の下にある信頼できるCAのリストに存在する「AddTrust External CA Root」です。したがって、これが信頼できるCAルートである場合、なぜ「証明パスの信頼アンカーが見つかりません」という例外がありますか?

described hereのように、サーバーによって提供されるチェーンに中間CAが含まれていないようです。実際には、openssl s_client -connectを使用してCAチェーンをチェックすると、中間CAが含まれていないことが確認されます。Android doc articleには、サーバーチェーンに中間CAを含めるか、特別なTrustManagerを作成して明示的にアプリケーションを信頼するという2つの解決策が示されています。私は前者をやりたい。

+0

P.S.診断と修正(提供された証明書チェーン内の中間CAを含む)が確認されます。サーバー上でその変更を行った後、問題は消えています。 – LarsH

関連する問題