如何在 nginx 中设置前向保密,以便具有默认 ATS 设置的 iOS9(Xcode7)应用程序可以连接到我的服务器?

如何在 nginx 中设置前向保密,以便具有默认 ATS 设置的 iOS9(Xcode7)应用程序可以连接到我的服务器?

iOS9 的 App Transport Security 规定,不满足某些要求的连接将会失败。以下是引自 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 设置连接到我的服务器。然而,在我设置应用程序的 后NSExceptionRequiresForwardSecrecyNO连接Info.plist成功了。所以看起来我的服务器没有正确配置前向保密密码。以下是我在 nginx.conf 中的当前设置:

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)。

根据苹果的文档,在默认的 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工具仍然表明问题是由前向保密引起的。


为了诊断目的,以下是安全测试我的服务器给出的结果页面截图ssllabs

在此处输入图片描述

相关内容