iOS9 的應用程式傳輸安全性規定,不滿足某些要求的連線將會失敗。以下是引用自Apple文件的要求(https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html)
- 伺服器必須至少支援傳輸層安全性 (TLS) 協定版本 1.2。
- 連線密碼僅限於提供前向保密的密碼(請參閱下面的密碼清單。)
- 憑證必須使用 SHA256 或更高的簽章雜湊演算法以及 2048 位元或更高的 RSA 金鑰或 256 位元或更高的橢圓曲線 (ECC) 金鑰進行簽章。
我已檢查我的伺服器確實使用具有 2048 位元 RSA 金鑰並使用 SHA256 雜湊演算法簽署的憑證。無論如何,我的 Xcode7 建立的應用程式無法使用預設 ATS 設定連接到我的伺服器。然而,當我在應用程式中NSExceptionRequiresForwardSecrecy
設定為後,連接成功了。所以看起來我的伺服器沒有正確配置前向保密密碼。以下是我目前在 nginx.conf 中的設定:NO
Info.plist
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
我的憑證是Comodo頒發的,上面我使用的設定也來自Comodo的支援文件(https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/789/37/certificate-installation-nginx)。
根據 Apple 的文檔,在預設 ATS 設定下,可接受的密碼包括:
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
(看來我的 nginx 的 ssl_ciphers 設定有這些密碼。)
如果在應用程式的設定中NSExceptionRequiresForwardSecrecy
設定為NO
,以下密碼也將被接受:
- LS_RSA_WITH_AES_256_GCM_SHA384
- TLS_RSA_WITH_AES_128_GCM_SHA256
- TLS_RSA_WITH_AES_256_CBC_SHA256
- TLS_RSA_WITH_AES_256_CBC_SHA
- TLS_RSA_WITH_AES_128_CBC_SHA256
- TLS_RSA_WITH_AES_128_CBC_SHA
設定為 後NO
,我的應用程式成功連接到我的伺服器,但我仍然不知道原因。
所以我的問題是,我應該如何為前向保密密碼設定 nginx,以便具有預設 ATS 設定的 iOS9(Xcode7)應用程式可以成功連接?
更新:
我按照以下指南重新配置了我的伺服器https://weakdh.org/sysadmin.html。我使用以下命令重新產生一個新的 DH 群組:
openssl dhparam -out dhparams.pem 2048
並將其添加到我的 nginx 配置中:
ssl_dhparam dhparams.pem;
但我的應用程式的連接仍然失敗。該nsurl --ats-diagnostics
工具仍然表明問題是由前向保密引起的。
出於診斷目的,以下是ssl測試我的伺服器的結果頁面螢幕截圖由ssll實驗室: