iOS 9에서 NSURLSession / NSURLConnection HTTP로드 실패


137

iOS9에서 기존 앱을 실행하려고했지만 사용하는 동안 오류가 발생했습니다 AFURLSessionManager.

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

다음과 같은 오류가 발생합니다.

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

또한 다음과 같은 로그가 표시됩니다.

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

업데이트 : 솔루션에 여러 업데이트를 추가 했습니다 .iOS 9에서 NSURLSession / NSURLConnection HTTP로드에 실패했습니다


첫 번째 줄에서 오류가 발생하고 있다고 확신합니까?
BSMP

1
나는 같은 문제가 있었다. 이것은 문제를 다루는 것처럼 보였다 : stackoverflow.com/questions/30720813/…
phillies2628

답변:


240

발견 된 해결책 :

iOS9에서 ATS는 HTTPS 사용을 포함하여 네트워크 호출 중에 모범 사례를 시행합니다.

Apple 설명서에서 :

ATS는 우발적 인 공개를 방지하고 안전한 기본 동작을 제공하며 쉽게 채택 할 수 있습니다. 새 앱을 만들거나 기존 앱을 업데이트하는지 여부에 관계없이 가능한 한 빨리 ATS를 채택해야합니다. 새로운 앱을 개발하는 경우 HTTPS를 독점적으로 사용해야합니다. 기존 앱이있는 경우 지금 가능한 한 HTTPS를 사용하고 가능한 한 빨리 나머지 앱을 마이그레이션하기위한 계획을 세워야합니다.

베타 1에서는 현재 info.plist에서이를 정의 할 수있는 방법이 없습니다. 해결책은 수동으로 추가하는 것입니다.

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

여기에 이미지 설명을 입력하십시오

업데이트 1 : iOS9 ATS 지원을 채택 할 준비가 될 때까지의 임시 해결 방법입니다.

업데이트 2 : 자세한 내용은 다음 링크를 참조하십시오 : http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

업데이트 3 : TLS 1.0 만있는 호스트 (YOURHOST.COM)에 연결하려고하는 경우

이것을 앱의 Info.plist에 추가하십시오

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOURHOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

10
Application Transport Security를 ​​완전히 제거 했으므로 iOS 9의 주요 기능 중 하나가 앱에서 사라졌습니다. 이것은 해킹이며, 그 해킹으로 인해 ap가 거부되는 경우 놀라지 않을 것입니다. 이 사전에 특정 웹 사이트를 추가하는 것이 더 가능합니다.
gnasher729 2016 년

2
@StevenPeterson Apple은 전체 앱을 사례별로 제외 할 수만 있습니다. Apple이이 기능으로 앱을 축복하면이 키를 포함 시키라고 지시합니다. 애플이이 작업을 거의하지 않을 것으로 예상합니다.
mattyohe

8
제발, 제발, 제발, 제발, 제발 - 제발 그냥 plist에 예외를 추가하고 "작동하기 때문에"로 이동하지 마십시오. 사용자 데이터의 보안을 고려하고 SSL 및 기타 보안 모범 사례를 구현하십시오.
산타 클로스

8
@ gnasher729, ATS를 비활성화하는 대신 TLS 1.2를 지원하는 것이 좋습니다. 그러나 타사 API / 웹 서비스를 사용하는 경우 어떻게해야합니까? 나는 그들을 강제로 업그레이드 할 수 없으므로 어떻게해야합니까 ??
Woodstock

7
이 답변에 미묘한 버그가 있습니다 : NSTemporaryExceptionMinimumTLSVersion예를 들어 있어야합니다 TLSv1.0 대신 1.0 것은 , NSAppTransportSecurity의 참조 예외 도메인 사전 키
MBI

54

iOS9에서 SSL을 다루는 방법 , 하나의 솔루션은 다음과 같습니다.

애플이 말하는 것처럼 : 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

앱의 Info.plist 파일에 예외 도메인을 지정하지 않으면 iOS 9 및 OSX 10.11에는 데이터를 요청하려는 모든 호스트에 대해 TLSv1.2 SSL이 필요합니다.

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 insecure HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

응용 프로그램 (예 : 타사 웹 브라우저)이 임의의 호스트에 연결해야하는 경우 다음과 같이 구성 할 수 있습니다.

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

이 작업을 수행해야하는 경우 TLSv1.2 및 SSL을 사용하도록 아직 업데이트하지 않은 경우 서버를 업데이트하는 것이 가장 좋습니다. 이는 임시 해결 방법으로 간주되어야합니다.

현재 시험판 문서에서는 이러한 구성 옵션에 대해 특정 방식으로 언급하지 않습니다. 일단 완료되면 관련 문서로 연결되도록 답변을 업데이트하겠습니다.

자세한 내용은 iOS9 로 이동 하십시오.


4
SSL 및 TLS는 HTTPS 프로토콜에서 사용하는 다른 암호화 계층입니다. 따라서 SSL을 모두 비활성화하고 TLS v1.2 이상을 사용해야합니다. 자세한 내용을 보려면 다음 리소스로 시작하는 것이 좋습니다. SSL / TLS Security 2015-간단한 요약 안내서
Conrad Taylor

2
NSAllowsArbitraryLoads를 true로 설정 한 맨 아래 예제와 함께 운이 좋았습니다. 내 서버는 TLS v1.2를 독점적으로 사용하고 있으며 여전히 작동하려면이 작업을 수행해야합니다. 매우 실망 스럽습니다.
스쿠터

1
프록시 서비스와 같은 새 앱이 App Store에서 승인 될 것임을 알기 위해 사용할 수있는 해결 방법이 있습니까?
Josh

41

App Transport Security에 관한 Apple의 기술 노트는 매우 편리합니다 . 문제에 대한보다 안전한 솔루션을 찾는 데 도움이되었습니다.

잘하면 이것은 다른 누군가를 도울 것입니다. 완벽하게 유효한 것으로 보이는 Amazon S3 URL, TLSv12 HTTPS URL에 연결하는 데 문제가있었습니다. 우리는 NSExceptionRequiresForwardSecrecyS3가 사용하는 또 다른 소수의 암호를 활성화 하기 위해 비활성화 해야했습니다.

우리의 Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

이것은 내 정확한 문제였으며 즉시 해결되었습니다! 감사! :)
Alex Zak

이렇게하면 내가 가진 문제도 해결됩니다. 다른 경우에는 다른 설정이 필요할 수 있습니다. 좋은 소식은 기술 노트에는 nsurl을 사용하여 일반적인 설정을 찾는 방법에 대한 정보도 포함되어 있다는 것입니다.
ecotax

Amazon S3 앞에서 CDN을 사용한 경우 cloudfront.net에 대해서도 동일한 작업을 수행해야했습니다.
Raymond26

7

Amazon S3 에서이 문제가 발생하면 info.plist에 최상위 태그의 직접 하위 항목으로 붙여 넣으십시오.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>

자세한 정보는 다음에서 찾을 수 있습니다.

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue


2
신의 축복이 있기를
Vervatovskis

5

여기 에서 해결책을 찾았 습니다. 그리고 그것은 나를 위해 일하고 있습니다.

이것을 확인하면 도움이 될 수 있습니다.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
         <dict>
             <key>myDomain.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>

4

.plist 파일에 다음 필드를 추가하기 만하면됩니다.

여기에 이미지 설명을 입력하십시오

구문은 다음과 같습니다.

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

모든 http 요청이 허용됩니다. 작동하지만 권장되지 않습니다.
KVISH

2

최신 정보:

Xcode 7.1부터는에서 NSAppTransportSecurity사전 을 수동으로 입력 할 필요가 없습니다 info.plist.

이제 자동 완성되고 사전임을 인식 한 다음 Allows Arbitrary로드도 자동 완성합니다 . info.plist 스크린 샷


모든 http 요청이 허용됩니다. 작동하지만 권장되지 않습니다.
KVISH

2

NSURLConnection Http로드 실패 버그 해결 info.plist에 다음 Dict를 추가하십시오.

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

1

info.plist에 키를 추가하여 해결했습니다. 내가 따르는 단계는 다음과 같습니다.

프로젝트의 info.plist 파일을 열었습니다

NSAppTransportSecurity라는 키를 사전으로 추가했습니다.

NSAllowsArbitraryLoads라는 하위 키를 부울로 추가하고 다음 이미지와 같이 해당 값을 YES로 설정합니다. 여기에 이미지 설명을 입력하십시오

프로젝트를 청소하면 지금처럼 모든 것이 제대로 작동합니다.

참조 링크 : https://stackoverflow.com/a/32609970


1

이 오류가 발생했을 때 저에게 효과적이었습니다.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

1

RCTHTTPRequestHandler.m 파일에이 함수를 추가 할 수 있습니다.

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }



0

당신은 추가해야합니다 App Transport Security Settings으로 info.plist하고 추가 Allow Arbitrary LoadsApp Transport Security Settings

여기에 이미지 설명을 입력하십시오

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.