web-dev-qa-db-ja.com

IOS 9でApp Transport Securityを有効にしてHTTP URLをロードする方法を教えてください。

そのため、昨夜リリースされたiOSの新しいベータ版SDKには「App Transport Security」があり、開発者はhttpの代わりにhttpsを使用することを推奨されています。原則として、これは素晴らしいアイデアであり、私はすでにステージング/プロダクション環境でhttpsを使用しています。しかし、私は自分のラップトップで実行しているWebサービスにiOSアプリが接続しているときには、私のローカル開発環境にhttpsを設定していません。

今朝のちょっとした遊びから、URLローディングシステムは、たとえあなたがそれにhttp URLを渡したとしても、代わりにhttpsを使うことを決定するように見えます。誰かがこの動作を無効にする方法を知っていますか - たとえ特定のURLのためだけであっても?

405

詳細については、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)

662
adurdin

受け入れられた答えが必要な情報を提供し、使用方法と詳細については 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>

詳細については、このリンクから取得できます。

105

続かれた これ

Info.plistにキーを追加して解決しました。私が従った手順は次のとおりです。

  1. 私のプロジェクトのinfo.plistファイルを開きました

  2. NSAppTransportSecurityとしてDictionaryというキーを追加しました。

  3. 次の図のように、NSAllowsArbitraryLoadsとしてBooleanというサブキーを追加し、その値をYESに設定します。 enter image description here

プロジェクトをきれいにして今、すべてが以前と同じように問題なく実行されています。

参照 リンク

53
Manab Kumar Mal

ローカルの開発サーバーに対してApp Transport Policyを無効にしたいだけであれば、次の解決策がうまくいきます。 HTTPSを設定できない場合や実用的でない場合(Google App Engine開発サーバーを使用している場合など)に便利です。

他の人が言っているように、ATPは間違いなくプロダクションアプリのためにオフにされるべきではありません。

1)デバッグ用に別のplistを使う

PlistファイルとNSAllowsArbitraryLoadsをコピーしてください。このPlistをデバッグに使用してください。

XCode Debug

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

2)ローカルサーバーを除外する

あるいは、単一のplistファイルを使用して特定のサーバーを除外することもできます。しかし、 IP 4アドレスを除外できるようには見えません そのため、代わりにサーバー名を使用する必要があるかもしれません([システム環境設定] - > [共有]にあります。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>server.local</key>
        <dict/>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
    </dict>
</dict>
30
Ian

Plistファイルとして解決しました。

  1. NSAppTransportSecurity:Dictionaryを追加します。
  2. "NSAllowsArbitraryLoads"という名前のサブキーをブール値として追加します。YES

enter image description here

28
Avinash651

上記の設定は私にはうまくいきませんでした。私はたくさんのキーの組み合わせを試しました、これはうまくいきます:

enter image description here

<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>
20
Damien Romito

@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はこのように見えなければなりません:

enter image description here

16
Aqib Mumtaz

これは私のために働いたものです:

<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);

これが役に立つことを願っています。乾杯。 :)

13
0yeoj