2017-05-08 1 views
0

이전에이 오류가 발생 했으므로 .plist 파일에 정보를 추가하는 것이 좋습니다. 던져 같은 오류Swift 3 NSURLSession/NSURLConnection 인증을 사용하여 사이트에 연결할 때 HTTP로드가 실패했습니다.

How do I load an HTTP URL with App Transport Security enabled in iOS 9?

NSURLSession/NSURLConnection HTTP load failed on iOS 9

여전히

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) on a subdomain?

내 프로그램 결과 :

2017- 나는 내가 본 것들 중 각 시도했습니다 05-08 08 : 29 : 37.781075-0400 xxxx [3256 : 408961] [nw_coretls_callback_handshake_message_block_invoke_3 tls_handshake_continue : [-9812],451,515,2017년 5월 8일 08 : 29 : 37.781 XXXX [3256 : 408982] NSURLSession /있는 NSURLConnection HTTP로드 실패 (kCFStreamErrorDomainSSL, -9813)

내 관련 코드는 여기에 있습니다 :

let username = "xxxx" 
    let password = "xxxx" 
    let loginString = String(format: "%@:%@", username, password) 
    let loginData = loginString.data(using: String.Encoding.utf8)! 
    let base64LoginString = loginData.base64EncodedString() 

    let baseUrl = "https://xxxx" 
    var request = URLRequest(url: URL(string: baseUrl)! as URL) 

let baseUrl = "server i want.xml" 
     let request = NSMutableURLRequest(url: NSURL(string: baseUrl)! as URL) 
     request.httpMethod = "POST" 
     request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization") 
     let session = URLSession.shared 

     var err: NSError? 

     let task = session.dataTask(with: request as URLRequest) { 
      (data, response, error) in 

      if data == nil { 
       print("dataTaskWithRequest error: \(err)") 
       return 
      } 

      let xml = SWXMLHash.parse(data!) 
      let serialNumFromXML = xml["mobile_devices"]["mobile_device"]["serial_number"].element?.text 

func urlSession(
    _ session: URLSession, 
    didReceive challenge: URLAuthenticationChallenge, 
    completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) 
{ 
    completionHandler(
     .useCredential, 
     URLCredential(trust: challenge.protectionSpace.serverTrust!)) 
} 

인증서와 관련이있을 수도 있지만 인증서를받지 못해서 서버를 변경할 수 없으므로 해당 인증서를받을 수 없습니다. plist를 변경하는 것보다 더 많은 것이 있습니까?

내 plist 파일에는 XML 파일이있는 도메인의 임의로드 허용 및 예외 도메인이 있습니다.

https://www.w3schools.com/xml/note.xml과 같은 테스트 파일의 내용을 가져올 수 있지만 필요한 파일은 사용자 이름/암호 "인증 필요"팝업 뒤에 있습니다.

나는 또한 Alamofire 라이브러리를 시도했습니다, 같은 일이 발생

nw_coretls_callback_handshake_message_block_invoke_3 tls_handshake_continue : [-9807] 2017년 5월 8일 09 : 42 : 08.452 XXX [6128 : 888398] NSURLSession /있는 NSURLConnection HTTP로드 (kCFStreamErrorDomainSSL, -9802)이

+0

이를 참조하십시오 http://stackoverflow.com/a/43303169/3901620 및 http://stackoverflow.com/a/ 33227527/3901620 – KKRocks

+0

@KKRocks 흠. 방금 자기 서명 인증서를 작성했지만 수정하지 않았습니다. nscurl은 모든 테스트에 실패하지만, 서버를 제어하지 못하므로 해결할 수 없습니다. – AON

답변

2

좋아 잘 나는이 문제를 해결하는 방법을 알고하지 않았다 실패했지만 나는 Alamofire가 내가 필요한 일을하는 데 사용할 수있는 것을 발견했다. 이것은 인벤토리 관리를위한 로컬 프로젝트이므로 인증서를 우회하는 보안에 대해 걱정하지 않았습니다. 내 코드는 여기에 있습니다 :

 Manager.delegate.sessionDidReceiveChallenge = { session, challenge in 
     var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling 
     var credential: URLCredential? 

     if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, let trust = challenge.protectionSpace.serverTrust { 
      disposition = URLSession.AuthChallengeDisposition.useCredential 
      credential = URLCredential(trust: trust) 
     } else { 
      if challenge.previousFailureCount > 0 { 
       disposition = .cancelAuthenticationChallenge 
      } else { 
       credential = Manager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace) 

       if credential != nil { 
        disposition = .useCredential 
       } 
      } 
     } 

     return (disposition, credential) 
    } 

private var Manager: Alamofire.SessionManager = { 

// Create the server trust policies 
let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
    "https://SERVER:PORT": .disableEvaluation 
] 

// Create custom manager 
let configuration = URLSessionConfiguration.default 
configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders 
let manager = Alamofire.SessionManager(
    configuration: URLSessionConfiguration.default, 
    serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) 
) 
let sessionManager = SessionManager(
    serverTrustPolicyManager: ServerTrustPolicyManager(
     policies: ["https://SERVER:PORT": .disableEvaluation] 
    ) 
) 
return manager 
}() 

open class MyServerTrustPolicyManager: ServerTrustPolicyManager { 

// Override this function in order to trust any self-signed https 
open override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? { 
    return ServerTrustPolicy.disableEvaluation 
} 

}