![如何在 nginx 中设置前向保密,以便具有默认 ATS 设置的 iOS9(Xcode7)应用程序可以连接到我的服务器?](https://linux22.com/image/668473/%E5%A6%82%E4%BD%95%E5%9C%A8%20nginx%20%E4%B8%AD%E8%AE%BE%E7%BD%AE%E5%89%8D%E5%90%91%E4%BF%9D%E5%AF%86%EF%BC%8C%E4%BB%A5%E4%BE%BF%E5%85%B7%E6%9C%89%E9%BB%98%E8%AE%A4%20ATS%20%E8%AE%BE%E7%BD%AE%E7%9A%84%20iOS9%EF%BC%88Xcode7%EF%BC%89%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%8F%AF%E4%BB%A5%E8%BF%9E%E6%8E%A5%E5%88%B0%E6%88%91%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F.png)
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 设置连接到我的服务器。然而,在我设置应用程序的 后NSExceptionRequiresForwardSecrecy
,NO
连接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: