web-dev-qa-db-ja.com

NSURLSession "HTTPロードに失敗しましたkCFStreamErrorDomainSSL、-9813;自己署名証明書

IOSアプリを、ネットワークのローカルホストで現在実行されているHTTPS Railsアプリに接続しようとしています。ブラウザーからhttps://myIP:3000/displayを使用して、またcurlリクエストを使用してコマンドラインでサイトにアクセスできます。私は私のアプリから次のものを使用してアクセスしようとしています:

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //let url = NSURL(string: "https://another/Sinatra/website/feed")
        let url = NSURL(string: "https://myIP:3000/display")

        let request = NSURLRequest(URL: url!)
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!)
        task!.resume()
    }

シナトラのWebサイトにアクセスしようとすると、問題はなく、正しいコマンドでJSONをコンソールに出力することもできます。ただし、Rails WebサイトにURLを設定すると、次のエラーが表示されます。

NSURLSession/NSURLConnection HTTPロードが失敗しました(kCFStreamErrorDomainSSL、-9813)

さらに、ローカルホストRailsアプリ(他のマシン上)はiOSアプリからはPingされず、ブラウザーとcurlコマンドからPingされていることがわかります。

これを修正する方法はありますか?

42
Marcus

私がよく理解していれば、Appleは、開発者にネットワーク呼び出しにHTTPSおよびTLS 1.2を使用するようになりました。

Temporary、これを「Info.plist」ファイルに追加できます。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

このリンクをご覧ください。また、役立つかもしれません: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

-

Update:いくつかのコメントに続いて、上記のソリューションはもう機能していません。これが更新されたソリューションです。

  1. Info.plistファイルに移動します。
  2. TypeDictionaryおよびKeyApp Transport Security Settingsの行を追加します。
  3. この辞書に、TypeBoolean、ofKeyAllow Arbitrary Loads、およびValueYES

-

それ以外の場合は、Domain Exceptionsを設定できます。これが方法です:

  1. Info.plistファイルに移動します。
  2. TypeDictionaryおよびKeyApp Transport Security Settingsの行を追加します。
  3. TypeDictionaryおよびKeyException Domainsの行を追加します。
  4. TypeDictionaryおよびKeyThe domainの行を追加します。
  5. TypeBooleanKeyNSExceptionAllowsInsecureHTTPLoadsNSIncludesSubdomainsの2行をValueto YES

リンク

https://forums.developer.Apple.com/message/5857#5857

2015 WWDCセッション711

iOS 9 HTTP接続エラー-StackOverflow

42
Antoine

これは信頼の問題です。自己署名証明書では、SSLのID検証コンポーネントは機能しません。誰も盗聴しないように安全な接続を確立することは可能ですが、アプリは誰が回線の反対側にいるかを確認できません。

同様の設定をしており、自己署名ルートCAをiPadの信頼できる証明書に追加することでこの問題を解決しました。このルートCAは、他のすべての開発証明書に署名するために使用されます。次に、SSLを使用する場所にこの単一のルート証明書を追加するだけです。直接使用している自己署名証明書がある場合は、おそらく追加するだけです。

デバイス(またはシミュレーター)に証明書を取得するために、ファイルをWebサーバーに配置します。次に、単純なHTTP経由でSafariで開きます。設定アプリが開き、証明書を信頼するかどうか尋ねられます。

もちろん、これはこれが開発専用であり、実稼働システムに既知の機関(つまり、ルート認証局のOSのデータベースに含まれる機関)によって署名された証明書があることを前提としています。エンドユーザーに自己署名証明書をインストールするように依頼することはできません。

20
Brian

これが私のために働いた唯一のソリューションです... AppDelegate.mファイルの最後に、コードを挿入します。

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

Jc ivancevichの記事をありがとう http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-Android-ios/

6
Anton P

(編集-期限切れの証明書である9814と誤解しています。この問題を解決する方法はわかりませんが、うまくいけば私の応答が正しい方向を示すのに役立ちます。)

通常の「任意のロードを許可」の質問とは異なる証明書の問題のように見えます。

以下からの簡単な抜粋: Appleドキュメント-付録A:共通サーバー信頼評価エラー

NSOSStatusErrorDomain errSSLNoRootCert -9813

1
The Problem

セッション変数を変更してみてください、この変更は私を助けます

let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
1
Margaret López

Info.plistの変更も同様に機能しました。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
0
rashmisingh622