iOS 9.3:发生SSL错误,无法build立与服务器的安全连接

我正在跟随自签名证书的错误

错误域= NSURLErrorDomain代码= -1200“发生SSL错误,无法build立与服务器的安全连接。

同时testing我的一个演示应用程序的Web服务

  • iOS 9.3
  • XCode 7.3
  • Swift 2.2
  • Alamofire 3.3.0
  • 和本地服务器: https : //filename.hostname.net

注意: 在假设它重复之前,我会要求请一路阅读,甚至同样我已经报告给苹果开发论坛

使用Alamofire库


func testAlamofireGETRequest() -> Void { Alamofire.request(.GET, "https://filename.hostname.net/HelloWeb/service/greeting/john") .responseJSON { response in print("Response JSON: \(response.result.value)") } } 

使用NSURLSession


 func testNSURLSessionRequest() -> Void { let session = NSURLSession.sharedSession() let urlString = "https://filename.hostname.net/HelloWeb/service/greeting/john" let url = NSURL(string: urlString) let request = NSURLRequest(URL: url!) let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in print("done, error: \(error)") //Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made. } dataTask.resume() } 

我花了2天没有运气:(

有一堆已经发布的问题,但没有为我工作

  • 传输安全已经阻止了明文HTTP
  • iOS9出现错误“发生了ssl错误,无法build立与服务器的安全连接”
  • 如何在iOS 9中启用启用App Transport Security的HTTP URL? [重复]
  • CFNetwork SSLHandshake失败的iOS 9
  • 如何在iOS中处理“CFNetwork SSLHandshake失败”
  • 使用自签名证书在iOS 9中进行HTTPS请求
  • ios9自签名证书和应用程序传输安全性

张贴Alamofire混帐问题

  • 执行非SSL请求#538时,'CFNetwork SSLHandshake失败(-9847)'错误
  • 自签名证书不被接受#876
  • 我怎样才能连接我的服务器作为HTTPS使用自签名证书文件#977

我的Info.pist文件以这种方式更新了ATS设置

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>filename.hostname.net</key> <dict> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> 

同时我能够得到回应

http://filename.hostname.net

https://google.com

不适用于https://filename.hostname.net

任何人都可以请build议我为什么我无法得到这个工作后,巨大的努力?

我认为你试图连接的服务器有无效的证书,或者不符合iOS 9的标准ECC,Ciphers等。

  • 如果您使用的是高级networkingAPI(NSURLSession,NSURLConnection或者其他层级上的任何东西),那么您不能直接控制客户端提供的密码套件。 这些API使用自己的内部逻辑来select一组密码套件。

  • 如果您使用低级联网API-CFSocketStream,通过其NSStream和CFStream API以及任何低于此的API,则可以明确select要使用的一组密码套件。 你如何做到这一点取决于具体的API。

标准做法是:

  1. 创buildstream对

  2. configuration它为TLS

  3. 使用kCFStreamPropertySSLContext属性获取安全传输上下文

  4. 在该上下文中configuration特定的属性

  5. 打开溪stream

你可以在TLSTool示例代码中看到这个例子。 具体来说,看一下TLSToolServer类,在这里你可以看到这个序列。

在一个非常短的环境中,您想要以避开安全性的方式来configurationstream,但是,在Alamofire的情况下,您可以直接通过以下方式执行此操作:

 func bypassAuthentication() { let manager = Alamofire.Manager.sharedInstance manager.delegate.sessionDidReceiveChallenge = { session, challenge in var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling var credential: NSURLCredential? if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { disposition = NSURLSessionAuthChallengeDisposition.UseCredential credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!) } else { if challenge.previousFailureCount > 0 { disposition = .CancelAuthenticationChallenge } else { credential = manager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace) if credential != nil { disposition = .UseCredential } } } return (disposition, credential) } } 

让我知道如果有帮助。 谢谢!

在OS X的命令行中,运行以下命令:

nscurl --ats-diagnostics https://filename.hostname.net --verbose

这将告诉你什么样的ATS设置的组合,将不会允许iOS访问您的网站,并应指出你的网站有什么问题。

它可能是以下一项或多项

  • 证书哈希algorithm(必须是SHA-256或以上)
  • TLS版本(必须是1.2)
  • TLSalgorithm(必须提供完善的正向保密)

苹果已经发布了App Transport Security的完整需求清单。

原来,我们正在使用TLS v1.2,但缺less一些其他要求。

这是完整的检查清单 :

  • TLS至less需要1.2版本。
  • 连接密码仅限于提供前向保密的密码(请参阅下面的密码列表)。
  • 该服务需要至less使用SHA256指纹的证书,该证书具有2048位或更大的RSA密钥或者256位或更大的椭圆曲线(ECC)密钥。
  • 无效的证书导致硬故障并且没有连接。
  • 接受的密码是: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

我有同样的情况,卡住了一天。 尝试与您的移动数据,如果这与您的API正常工作,然后问题与您的networking防火墙。 然后从防火墙设置中启用SSL / TLS。