针对支持TLSv1.2

时间:2016-06-11 16:57:50

标签: ios swift ssl tls1.2

我有一个非常简单的tomcat网络服务器,我已设置使用TLSv1.2,使用curl确认

$ curl --verbose https://{my-servers-dns}:8443/
*   Trying {my-servers-ip-address} ...
* Connected to dev.a-b.fit ({my-servers-ip-address}) port 8443 (#0)
* TLS 1.2 connection using TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
* Server certificate: {my-servers-dns}
* Server certificate: Go Daddy Secure Certificate Authority - G2
* Server certificate: Go Daddy Root Certificate Authority - G2
> GET / HTTP/1.1
...

但是,如果我运行这个非常简单的swift代码来发出相同的GET请求

let url = NSURL(string: "https://{my-servers-dns}:8443/")!
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url, completionHandler: {(data, response, error) -> Void in
    if let response = response {
        print("Response: \(response)")
    }
    else {
        print("Response: nil")
    }
})

当我这样做时,我得到以下2个错误

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

搜索这些错误表明问题是我的应用无法与TLSv1.2连接。但是,我原以为curl请求表明支持TLS 1.2。

1 个答案:

答案 0 :(得分:1)

* TLS 1.2 connection using TLS_DHE_RSA_WITH_AES_256_CBC_SHA256

这是一个DHE密码套件curl在这里使用。这可能意味着您的服务器不支持ECDHE密码套件,因为与DHE相比,这些密码套件通常是首选。

来自iOS 9 Release Notes

  

现在,Secure Transport for TLS客户端默认禁用DHE_RSA密码套件。这可能导致无法连接到仅支持DHE_RSA密码套件的TLS服务器。 ...

这意味着如果您的服务器仅支持DHE密码,则连接将在iOS 9客户端的默认设置中失败。这可能是这种情况。