2017-09-15 68 views
0

開始時,我們有它獲取對的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。那麼他們是否會降低版本?

回答

1

IIRC,版本特定的常量設置特定版本,並且它不會協商任何其他版本。相比之下,協商允許它由於安全考慮(例如SSLv3)協商任何未被Apple列入黑名單的版本。

因此,我的回憶是一般建議是始終在客戶端使用協商,除非您需要使用特定版本來啓用對無法使用SSL/TLS的新版本的主機的支持,或者不支持正確協商的服務器,然後始終將服務器設置爲僅接受最新版本(如果需要支持較早的客戶端,則稍微老一些)。

該方法的優勢在於,您的客戶端代碼無需更改,因爲Apple會添加新版本並棄用舊版本,並且服務器可能在您的直接控制之下,因此您可以隨時更改而不用強制您的用戶可以下載軟件更新。