我们有一个针对 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 。
我有两个问题:
为什么在 TLSv1 上为 10.9-10.11.2进行通话?不应该自动选择可用的最高版本,即 TLSv1 0.2
使用 kCFStreamSocketSecurityLevelTLSv1_2
时,如果服务器不支持TLSv1.2或者呼叫失败,是否会回退到较低版本?
检查时我发现了这个:
kCFStreamSocketSecurityLevelNegotiatedSSL
讨论:流 属性值,用于设置和复制操作。表示使用TLS 或者回退到较低版本的SSL。这就是HTTPS的用途 实例
kCFStreamSocketSecurityLevelTLSv1_2
甚至 kCFStreamSocketSecurityLevelTLSv1
都没有这样的声明。那么他们是否会回退降低版本?
答案 0 :(得分:1)
因此,我的回忆是,一般的建议是始终在客户端使用Negotiate,除非您需要使用特定版本来启用对无法使用较新版本的SSL / TLS的主机或服务器的支持不能正确支持协商,然后始终将服务器设置为仅接受最新版本(如果需要支持较旧的客户端,则稍微过时)。
这种方法的优势在于,当Apple添加新版本并弃用旧版本时,您的客户端代码不会发生变化,并且服务器可能在您的直接控制之下,因此您可以随时更改它强迫用户下载软件更新。