如何在 nginx 中設定前向保密,以便具有預設 ATS 設定的 iOS9 (Xcode7) 應用程式可以連接到我的伺服器?

如何在 nginx 中設定前向保密,以便具有預設 ATS 設定的 iOS9 (Xcode7) 應用程式可以連接到我的伺服器?

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 中的設定:NOInfo.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實驗室

在此輸入影像描述

相關內容