默认SSLLevel在Mac OS 10.9使用NSURLConnection的

问题描述:

开始时,我们有它获取对的Mac 10.6 SDK构建的遗留应用程序。我们正在使用的NSURLMutableRequestNSURLConnection进行网络通话。使用Wireshark,我注意到在10.9 - 10.11.2上所有这些调用都是在TLSv1上进行的。在10.11.6起(也10.13测试版)这些获得由上TLSv1.2工作默认SSLLevel在Mac OS 10.9使用NSURLConnection的

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

苹果文档上kCFStreamSSLLevel

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

和从kCFStreamSocketSecurityLevelNegotiatedSSL

指定,可以是 协商的*别的安全性协议被设置为用于插座流的安全协议。

我知道TLSv1.2工作支撑在10.9。作为测试,我设置kCFStreamSSLLevelkCFStreamSocketSecurityLevelNegotiatedSSL和10.9它仍然作出的TLSv1电话。

我有2个问题:

  1. 为什么电话大干快上的TLSv1取得了10.9-10.11.2?难道他们不应该自动选择可用即TLSv1.2工作最高版本。

  2. 当使用kCFStreamSocketSecurityLevelTLSv1_2,如果服务器不支持TLSv1.2或者调用会失败,是否会回退到较低版本? 我发现这一点的同时检查:

kCFStreamSocketSecurityLevelNegotiatedSSL

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

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

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

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

该方法的优势在于,您的客户端代码无需更改,因为Apple会添加新版本并弃用旧版本,并且服务器可能在您的直接控制之下,因此您可以随时更改而不用强制您的用户可以下载软件更新。