Problema: nuestra aplicación móvil ya no puede establecer una conexión segura con nuestro servicio web, ya que iOS 9 ahora usa ATS.
Antecedentes: iOS 9 presenta App Transport Security
Configuración del servidor: Windows Server 2008 R2 SP1 (VM) IIS 7.5, certificados SSL de digicert. Firewall de Windows desactivado.
Clave RSA 2048 bits (e 65537)
Emisor DigiCert SHA2 Secure Server CA
Algoritmo de firma SHA512 con RSA
Estos son los requisitos de seguridad de transporte de aplicaciones:
El servidor debe admitir al menos la versión 1.2 del protocolo de Seguridad de la capa de transporte (TLS). Los cifrados de conexión están limitados a aquellos que brindan confidencialidad directa (consulte la lista de cifrados a continuación). Los certificados deben firmarse utilizando un SHA256 o un algoritmo hash de firma mejor, con una clave RSA de 2048 bits o más o una curva elíptica de 256 bits o más Tecla (ECC). Los certificados no válidos provocan un fallo grave y no hay conexión. Estas son las cifras aceptadas:
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
Lo que se ha intentado:
- Agregando excepciones en la aplicación móvil para permitir que nuestro dominio funcione, pero no quiero seguir con este método no seguro, quiero arreglar nuestro SSL.
- Usé IIS Crypto para usar 'mejores prácticas', probé 'pci' y configuraciones personalizadas. Incluso intenté modificar la suite de cifrado solo para la lista anterior y reordenar. Después de cada intento, se reinicia el servidor y se ejecuta SSL Labs (después de borrar la memoria caché). Tuve éxito al pasar de una calificación F a una A, e incluso A-, pero esto solo resultó en que iOS 8 y 9 no pudieron establecer conexiones seguras. (Código de dominio NSURLError = -1200 y _kCFStreamErrorCodeKey = -9806)
- Restablecí la máquina virtual y probé un script de PowerShell. Configure su IIS para SSL Perfect Forward Secrecy y TLS 1.2 . Incluso hice un segundo intento en el que edité los cifrados del script de poder en una lista mínima de lo que se requiere.
Resultados: siempre similares, calificaciones de A o A-. iOS8 e iOS9 no pueden negociar una conexión segura. La simulación de apretón de manos da como resultado una "discrepancia de protocolo o conjunto de cifrado" para productos Safari e iOS.
ACTUALIZACIÓN Después de trabajar con el soporte de Apple, hicimos algunas capturas de rastreo de paquetes:
$ tcpdump -n -r trace.pcap
reading from file trace.pcap, link-type EN10MB (Ethernet)
client > server [S], seq 1750839998, win 65535, length 0
server > client [S.], seq 2461151276, ack 1750839999, win 8192, length 0
client > server [.], ack 1, win 4104, length 0
client > server [P.], seq 1:175, ack 1, win 4104, length 174
server > client [R.], seq 1, ack 175, win 0, length 0
Los primeros tres paquetes son el clásico apretón de manos de tres vías SYN - SYN-ACK - ACK que configura la conexión TCP. El cuarto paquete es iOS enviando a su servidor un mensaje de saludo de cliente TLS, el primer paso para configurar una conexión TLS a través de esa conexión TCP. He separado este mensaje y parece bastante razonable. En el quinto paquete, el servidor simplemente desconecta la conexión (enviando un RST).
¿Alguien sabe por qué IIS 7.5 estaría haciendo un RST?