使用NSURLConnection时,Mac OS 10.9以上的默认SSLLevel

时间:2017-09-15 08:38:01

标签: ssl nsurlconnection nsurl tls1.2 cfnetwork

我们有一个针对 Mac 10.6 sdk构建的遗留应用。我们正在使用 NSURLMutableRequest NSURLConnection 进行网络通话。使用Wireshark,我注意到在10.9 - 10.11.2上所有这些调用都是在TLSv1上进行的。在 10.11.6起(也是10.13 beta)上,这些是在 TLSv1.2 上进行的。

我使用 CFURLRequestSetSSLProperties(dlsym)更改了代码以强制使用TLSv1.2。我将 kCFStreamSSLLevel 设置为" kCFStreamSocketSecurityLevelTLSv1_2"。在这些之后,我可以看到现在在TLSv1.2上进行了调用。

来自kCFStreamSSLLevel Apple文档:

  

默认情况下,流的安全级别为   kCFStreamSocketSecurityLevelNegotiatedSSL。

kCFStreamSocketSecurityLevelNegotiatedSSL

  

指定可以使用的最高级别安全协议   negotiated被设置为套接字流的安全协议。

我知道10.9支持TLSv1.2。作为测试,我将 kCFStreamSSLLevel 设置为 kCFStreamSocketSecurityLevelNegotiatedSSL ,在10.9上,它仍然会调用 TLSv1

我有两个问题:

  1. 为什么在 TLSv1 上为 10.9-10.11.2进行通话?不应该自动选择可用的最高版本,即 TLSv1 0.2

  2. 使用 kCFStreamSocketSecurityLevelTLSv1_2 时,如果服务器不支持TLSv1.2或者呼叫失败,是否会回退到较低版本? 检查时我发现了这个:

  3.   

    kCFStreamSocketSecurityLevelNegotiatedSSL

         

    讨论:流   属性值,用于设置和复制操作。表示使用TLS   或者回退到较低版本的SSL。这就是HTTPS的用途   实例

    kCFStreamSocketSecurityLevelTLSv1_2 甚至 kCFStreamSocketSecurityLevelTLSv1 都没有这样的声明。那么他们是否会回退降低版本?

1 个答案:

答案 0 :(得分:1)

IIRC,特定于版本的常量设置了特定版本,并且它不会协商任何其他版本。相比之下,谈判允许它协商任何因安全问题而未被Apple列入黑名单的版本(例如SSLv3)。

因此,我的回忆是,一般的建议是始终在客户端使用Negotiate,除非您需要使用特定版本来启用对无法使用较新版本的SSL / TLS的主机或服务器的支持不能正确支持协商,然后始终将服务器设置为仅接受最新版本(如果需要支持较旧的客户端,则稍微过时)。

这种方法的优势在于,当Apple添加新版本并弃用旧版本时,您的客户端代码不会发生变化,并且服务器可能在您的直接控制之下,因此您可以随时更改它强迫用户下载软件更新。