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されていることがわかります。
これを修正する方法はありますか?
私がよく理解していれば、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:いくつかのコメントに続いて、上記のソリューションはもう機能していません。これが更新されたソリューションです。
Info.plist
ファイルに移動します。Dictionary
およびKeyApp Transport Security Settings
の行を追加します。Boolean
、ofKeyAllow Arbitrary Loads
、およびValueYES
-
それ以外の場合は、Domain Exceptions
を設定できます。これが方法です:
Info.plist
ファイルに移動します。Dictionary
およびKeyApp Transport Security Settings
の行を追加します。Dictionary
およびKeyException Domains
の行を追加します。Dictionary
およびKeyThe domain
の行を追加します。Boolean
とKeyNSExceptionAllowsInsecureHTTPLoads
&NSIncludesSubdomains
の2行をValueto YES
。リンク
これは信頼の問題です。自己署名証明書では、SSLのID検証コンポーネントは機能しません。誰も盗聴しないように安全な接続を確立することは可能ですが、アプリは誰が回線の反対側にいるかを確認できません。
同様の設定をしており、自己署名ルートCAをiPadの信頼できる証明書に追加することでこの問題を解決しました。このルートCAは、他のすべての開発証明書に署名するために使用されます。次に、SSLを使用する場所にこの単一のルート証明書を追加するだけです。直接使用している自己署名証明書がある場合は、おそらく追加するだけです。
デバイス(またはシミュレーター)に証明書を取得するために、ファイルをWebサーバーに配置します。次に、単純なHTTP経由でSafariで開きます。設定アプリが開き、証明書を信頼するかどうか尋ねられます。
もちろん、これはこれが開発専用であり、実稼働システムに既知の機関(つまり、ルート認証局のOSのデータベースに含まれる機関)によって署名された証明書があることを前提としています。エンドユーザーに自己署名証明書をインストールするように依頼することはできません。
これが私のために働いた唯一のソリューションです... 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/
(編集-期限切れの証明書である9814と誤解しています。この問題を解決する方法はわかりませんが、うまくいけば私の応答が正しい方向を示すのに役立ちます。)
通常の「任意のロードを許可」の質問とは異なる証明書の問題のように見えます。
以下からの簡単な抜粋: Appleドキュメント-付録A:共通サーバー信頼評価エラー
NSOSStatusErrorDomain errSSLNoRootCert -9813
セッション変数を変更してみてください、この変更は私を助けます
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
Info.plistの変更も同様に機能しました。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>