it-swarm.dev

NSURLSession "HTTP로드 실패 kCFStreamErrorDomainSSL, -9813; 자체 서명 인증서

IOS 앱을 현재 네트워크의 로컬 호스트에서 실행되는 HTTPS Rails 앱에 연결하려고합니다. 컬 요청이있는 명령 줄뿐만 아니라 https://myIP:3000/display를 사용하여 브라우저에서 사이트에 액세스 할 수 있습니다. 다음을 사용하여 앱에서 액세스하려고합니다.

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()
    }

Sinatra 웹 사이트에 액세스하려고하면 문제가 없으며 올바른 명령으로 JSON을 콘솔에 인쇄 할 수도 있습니다. 그러나 url을 Rails 웹 ​​사이트로 설정하면 다음 오류가 발생합니다.

NSURLSession/NSURLConnection HTTP로드 실패 (kCFStreamErrorDomainSSL, -9813)

또한 내 로컬 호스트 Rails 앱 (다른 시스템)이 iOS 앱에서 ping되지 않지만 브라우저 및 curl 명령에서 ping됩니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

42
Marcus

내가 잘 이해한다면 Apple은 개발자들이 네트워크 호출에 HTTPS와 TLS 1.2를 사용하기를 원합니다.

임시 , "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. Type Dictionary Key App Transport Security Settings의 행을 추가하십시오.
  3. 이 사전에서 Type Boolean, Key Allow Arbitrary LoadsYES

-

그렇지 않으면 Domain Exceptions를 설정할 수 있습니다. 방법은 다음과 같습니다.

  1. Info.plist 파일로 이동하십시오.
  2. Type Dictionary Key App Transport Security Settings의 행을 추가하십시오.
  3. Type Dictionary Key Exception Domains의 행을 추가하십시오.
  4. Type Dictionary Key The domain의 행을 추가하십시오.
  5. Type Boolean Key NSExceptionAllowsInsecureHTTPLoads & NSIncludesSubdomains의 두 행을 에서 YES.

링크

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

2015 WWDC 세션 711

iOS 9 HTTP 연결 오류-StackOverflow

42
Antoine

이것은 신뢰 문제입니다. 자체 서명 된 인증서를 사용하면 SSL의 신원 확인 구성 요소가 작동하지 않습니다. 아무도 도청하지 않도록 안전한 연결을 설정할 수는 있지만 앱은 누가 상대방의 전화를 받았는지 알 수 없습니다.

비슷한 설정이 있으며 자체 서명 된 루트 CA를 iPad의 신뢰할 수있는 인증서에 추가하여이 문제를 해결했습니다. 이 루트 CA는 다른 모든 개발 인증서에 서명하는 데 사용됩니다. 그런 다음 SSL을 사용할 위치에이 단일 루트 인증서를 추가하면됩니다. 직접 사용하고있는 자체 서명 된 인증서 만 있다면 추가 할 수 있습니다.

인증서를 장치 (또는 시뮬레이터)에 가져 오기 위해 파일을 웹 서버에 넣었습니다. 그런 다음 일반 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 Documentation-부록 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