如何在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设置连接到服务器.但是,在应用程序的Info.plist中将NSExceptionRequiresForwardSecrecy设置为NO之后,连接成功.因此,看来我的服务器未正确配置前向保密密码.以下是我在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).

根据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

将此设置为“否”后,尽管原因仍然未知,但我的应用程序已成功连接到服务器.

所以我的问题是,我应该如何为正向保密密码设置nginx,以便具有默认ATS设置的iOS9(Xcode7)应用程序可以成功连接?

更新:

根据@keno的建议,我按照https://weakdh.org/sysadmin.html的指南重新配置了服务器.我使用以下命令重新生成了新的DH组:

openssl dhparam -out dhparams.pem 2048

并将其添加到我的nginx配置中:

ssl_dhparam dhparams.pem;

但是从我的应用程序连接仍然失败. nsurl –ats-diagnostics工具仍指示该问题是由向前保密引起的.

出于诊断目的,以下是ssllabs给出的我服务器的ssltest结果页面屏幕截图:

enter image description here

最佳答案
您要在2015年10月运行nginx / 1.0.15(基于您的Qualys屏幕截图),以进行新的部署,该版本已于2012年4月发布,作为1.0系列的最终维护版本?

尽管https://www.digicert.com/ssl-support/ssl-enabling-perfect-forward-secrecy.htm#nginx_forward_secrecyhttps://community.qualys.com/blogs/securitylabs/2013/08/05/configuring-apache-nginx-and-openssl-for-forward-secrecy声称nginx 1.0.6是正向保密所需的最低nginx版本,但也可能是您的SSL版本也不太幸运成为OpenSSL 1.0.1c.

相关文章

文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、N...
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的...
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时...
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+...
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以...
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx ...