¿Cómo configurar el secreto directo en nginx para que la aplicación iOS9 (Xcode7) con la configuración ATS predeterminada pueda conectarse a mi servidor?

¿Cómo configurar el secreto directo en nginx para que la aplicación iOS9 (Xcode7) con la configuración ATS predeterminada pueda conectarse a mi servidor?

La App Transport Security de iOS9 establece que las conexiones que no cumplan ciertos requisitos fallarán. A continuación se muestran los requisitos citados en el documento de Apple (https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html)

  • El servidor debe admitir al menos la versión 1.2 del protocolo Transport Layer Security (TLS).
  • Los cifrados de conexión se limitan a aquellos que proporcionan secreto directo (consulte la lista de cifrados a continuación).
  • Los certificados deben firmarse utilizando un algoritmo hash de firma SHA256 o superior, con una clave RSA de 2048 bits o superior o una clave de curva elíptica (ECC) de 256 bits o superior.

Verifiqué que mi servidor esté usando un certificado con una clave RSA de 2048 bits y firmado usando el algoritmo hash SHA256. De todos modos, mi aplicación creada por Xcode7 no pudo conectarse a mi servidor con la configuración ATS predeterminada. Sin embargo, después de configurar NSExceptionRequiresForwardSecrecyla NOaplicación Info.plist, la conexión se realizó correctamente. Entonces parece que mi servidor no está configurado correctamente con cifrados de secreto directo. A continuación se muestra mi configuración actual en 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';

Mi certificado es emitido por Comodo y la configuración que utilicé anteriormente también proviene del documento de soporte de Comodo (https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/789/37/certificate-installation-nginx).

Según el documento de Apple, con la configuración ATS predeterminada, los cifrados aceptados incluyen:

  • 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

(Parece que la configuración ssl_ciphers de mi nginx tiene estos cifrados).

Y si NSExceptionRequiresForwardSecrecyestá configurado NOen la configuración de la aplicación, también se aceptarán los siguientes cifrados:

  • 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

Con esto configurado en NO, mi aplicación se conecta correctamente a mi servidor, aunque desconozco el motivo.

Entonces mi pregunta es, ¿cómo debo configurar nginx para cifrados de secreto directo para que la aplicación iOS9 (Xcode7) con la configuración ATS predeterminada pueda conectarse correctamente?


ACTUALIZADO:

Reconfiguré mi servidor siguiendo la guía dehttps://weakdh.org/sysadmin.html. Regenero un nuevo grupo DH con el siguiente comando:

openssl dhparam -out dhparams.pem 2048

y lo agregué en mi configuración de nginx:

ssl_dhparam dhparams.pem;

Pero la conexión desde mi aplicación sigue fallando. La nsurl --ats-diagnosticsherramienta todavía indica que el problema se debe al secreto directo.


Para fines de diagnóstico, a continuación se muestra laprueba sslcaptura de pantalla de la página de resultados de mi servidor proporcionada porssllabs:

ingrese la descripción de la imagen aquí

información relacionada