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

iOS9的应用程序传输安全性指出,不符合特定要求的连接将失败。 以下是Apple的文档( https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html )引用的要求。

  • 服务器必须至less支持传输层安全性(TLS)协议版本1.2。
  • 连接密码仅限于提供前向保密的密码(请参阅下面的密码列表)。
  • 证书必须使用SHA256或更大的签名散列algorithm进行签名,并使用2048位或更大的RSA密钥或者256位或更大的椭圆曲线(ECC)密钥。

我已经检查过我的服务器确实正在使用带有2048位RSA密钥的证书,并使用SHA256哈希algorithm进行签名。 无论如何,我的Xcode7构build的应用程序无法连接到我的服务器的默认ATS设置。 但是,在应用程序的Info.plist中将NSExceptionRequiresForwardSecrecy设置为NO后,连接成功。 所以看起来我的服务器没有正确configuration正向保密密码。 以下是我在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中的指导重新configuration了我的服务器。 我使用以下命令重新生成一个新的DH组:

 openssl dhparam -out dhparams.pem 2048 

并将其添加到我的nginxconfiguration中:

 ssl_dhparam dhparams.pem; 

但是从我的应用程序的连接仍然失败。 nsurl --ats-diagnostics工具仍然表明问题是由前向保密造成的。


为了进行诊断,以下是ssllabs给出的服务器的ssltest结果页面截图:

在这里输入图像说明