web-dev-qa-db-ja.com

CordovaアプリでHTTPロードが失敗しました(kCFStreamErrorDomainSSL、-9813)

Cordova 3.2とjquery mobile 1.3を使用してiOSアプリを作成しました。 jquery ajaxを使用してリクエストをRESTfullサービスに送信し、情報を取得/更新します。

さまざまなiOSバージョンを備えたさまざまなiPhone、さまざまなテストデバイスがあります。 iOS 7を実行しているiPhone 4Sで、ajaxリクエストが送信されると、次のエラーが表示されます。

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

これは、このデバイス、iOS 7を実行する別のiPhone 4Sでのみ発生します。これは、私が使用している他のすべてのテストデバイスと同様に、まったく問題なく動作します。

私はこれが何らかの形で証明書が無効であることを示していることを読んだことがあります、その場合、これは無視でき、なぜ1つのデバイスに影響しますか?

誰かがこれがなぜ起こっているのか、私のデバイスの1つでしか動作しないようにするデバイスについて何が違うのかを提案できますか?ありがとう

18
Martin Cassidy

一部のデバイスで機能し、他のデバイスでは機能しない場合、それらのデバイスの証明書検証パラメーターにいくつかの違いがあります。確認するべきいくつかの事柄はここにあります:

  1. 幸せなデバイスには、不幸なデバイスにはないルート証明書がありますか?特に、異なるバージョンのiOSを実行している場合、信頼できる証明書のリストも異なる場合があります。 Settings> General> Aboutに移動して、一番下の「Trust Store」の数値を比較してみてください。詳細情報を参照してください こちら
  2. 過去のある時点で、ハッピーデバイスで(この証明書の署名に使用される)中間証明書を手動で受け入れましたか?*
  3. 不幸なデバイスの日付/時刻は間違っていますか?証明書の有効期限後または証明書発行日前に設定されている場合、拒否されます。私はいつもこれを使って自分自身を撃ちます!

不幸なデバイスのブラウザーでエンドポイントURLにアクセスすると、どのようなエラーが発生しますか? (注:正しいヘッダーとパラメーターを要求していないため、サーバーからエラーが発生することは明らかです。しかし、Safari自体について話しているのです。証明書に誤りがあります。)

*私が覚えていないことを修正するために編集しました:あなたはnotあなたがSafariのURLに行くとリーフ証明書を受け入れるオプションがあります中間証明書を直接ロードしようとした場合に中間証明書を受け入れるオプション。

12
Arkaaito

私も同様の問題を抱えていましたが、私の場合、これはすべてのデバイスで発生し、httpsを使用したajax呼び出し中にのみ発生していました。

その場合、appDelegate.mファイルの最後に以下のコードを追加すると、問題が軽減されます。

@implementation NSURLRequest(DataController) 
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)Host 
{ 
return YES; 
} 
@end 

しかし、他のデバイスで動作している場合、私が提供したソリューションは効果的ではない可能性があることを疑います。しかし、試してみてください。

33
Markiv

Swift Markivs answer)のバージョンhere から取得):

extension NSURLRequest {
    static func allowsAnyHTTPSCertificateForHost(Host: String) -> Bool {
        return true
    }
}
2
Chris

Xcode 7.3 Swift 2.2

これを機能させるには、3つのことをしなければなりませんでした。

  1. クラスの終了}の後、クリスの答えをAppDelegate.Swiftの下部に追加する必要がありました。
  2. 次に、この回答を使用してInfo.plistを変更します https://stackoverflow.com/a/3270169
  3. IPアドレスの代わりにサーバーのドメイン名を設定してください
2
Brewster

シミュレータでアプリケーションを実行しているときに同じ問題が発生しました。この背後にある理由は、シミュレータに信頼できる証明書がないことです。

実行中のシミュレータウィンドウに.cerファイルをドラッグアンドドロップするだけです。 Safariが点滅し、証明書(または認証局)のインポートダイアログが表示されます...

1
user3540599