そのため、昨夜リリースされたiOSの新しいベータ版SDKには「App Transport Security」があり、開発者はhttpの代わりにhttpsを使用することを推奨されています。原則として、これは素晴らしいアイデアであり、私はすでにステージング/プロダクション環境でhttpsを使用しています。しかし、私は自分のラップトップで実行しているWebサービスにiOSアプリが接続しているときには、私のローカル開発環境にhttpsを設定していません。
今朝のちょっとした遊びから、URLローディングシステムは、たとえあなたがそれにhttp URLを渡したとしても、代わりにhttpsを使うことを決定するように見えます。誰かがこの動作を無効にする方法を知っていますか - たとえ特定のURLのためだけであっても?
詳細については、Appleの Info.plistリファレンス を参照してください(ありがとう@ gnasher729)。
Info.plistに特定のドメインに対する例外を追加できます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
除外された各ドメインのすべてのキーはオプションです。話者はどの鍵についても詳しく述べなかったが、私はそれらがすべて明らかに明白であると思う。
(出典: WWDC 2015セッション703、「プライバシーとあなたのアプリ」 、30:18)
アプリに理由がある場合は、単一のキーですべてのアプリ転送セキュリティ制限を無視することもできます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
アプリに正当な理由がない場合は、拒否される可能性があります。
NSAllowsArbitraryLoadsをtrueに設定すると動作するようになりますが、Appleは明確な理由なしにこのフラグを使用するアプリを拒否しようとしているという点で非常に明確でした。 NSAllowsArbitraryLoadsを使用する主な理由は、ユーザーが作成したコンテンツ(リンク共有、カスタムWebブラウザなど)です。そしてこの場合、Appleはあなたが管理しているURLにATSを強制する例外を含めることをまだ期待しています。
TLS 1.2を介して提供されていない特定のURLにアクセスする必要がある場合は、それらのドメインに対して特定の例外を記述する必要があります。NSAllowsArbitraryLoadsをyesに設定しないでください。あなたはNSURLSesssion WWDCセッションでより多くの情報を見つけることができます。
NSAllowsArbitraryLoadsソリューションを共有する際には注意してください。アップルからの推奨される修正方法ではありません。
- kcharwood (ありがとう@ marco-tolman)
受け入れられた答えが必要な情報を提供し、使用方法と詳細については App Transport Securityを無効にすることでこれを見つけることができます です。
ドメインごとの例外の場合、これらをInfo.plistに追加します。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
しかし、使用する必要があるすべての安全でないドメインを知らない場合はどうすればよいですか?Info .plist
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
ローカルの開発サーバーに対してApp Transport Policyを無効にしたいだけであれば、次の解決策がうまくいきます。 HTTPSを設定できない場合や実用的でない場合(Google App Engine開発サーバーを使用している場合など)に便利です。
他の人が言っているように、ATPは間違いなくプロダクションアプリのためにオフにされるべきではありません。
PlistファイルとNSAllowsArbitraryLoadsをコピーしてください。このPlistをデバッグに使用してください。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
あるいは、単一のplistファイルを使用して特定のサーバーを除外することもできます。しかし、 IP 4アドレスを除外できるようには見えません そのため、代わりにサーバー名を使用する必要があるかもしれません([システム環境設定] - > [共有]にあります。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>server.local</key>
<dict/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
上記の設定は私にはうまくいきませんでした。私はたくさんのキーの組み合わせを試しました、これはうまくいきます:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>mydomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
@adurdinと@Userによって与えられた回答をまとめる
Info.plistに以下を追加して、対応するドメイン名でlocalhost.com
を変更してください。複数のドメインを追加することもできます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
</plist>
あなたinfo.plistはこのように見えなければなりません:
これは私のために働いたものです:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key><!-- your_remote_server.com / localhost --></key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
<!-- add more domain here -->
</dict>
</dict>
私はただ他の人を助けて時間を節約するためにこれを追加したいです。
CFStreamCreatePairWithSocketToHost
を使用している場合あなたのHost
があなたの.plist
にあるものと同じであることを確かめてください、あるいはあなたがソケットのための別のドメインを持っているならそれを単にそれを追加してください。
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);
これが役に立つことを願っています。乾杯。 :)