iOS9的应用程序传输安全性指出,不符合特定要求的连接将失败。 以下是Apple的文档( https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html )引用的要求。
我已经检查过我的服务器确实正在使用带有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设置下,可接受的密码包括:
(似乎我的nginx的ssl_ciphers设置有这些密码。)
如果NSExceptionRequiresForwardSecrecy在应用程序的设置中设置为NO ,那么下面的密码也将被接受:
有了这个设置为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结果页面截图: