Problema: nosso aplicativo móvel não pode mais estabelecer uma conexão segura com nosso serviço da Web, já que o iOS 9 agora usa o ATS.
Plano de fundo: iOS 9 apresenta App Transport Security
Configuração do servidor: Windows Server 2008 R2 SP1 (VM) IIS 7.5, certificados SSL da digicert. Firewall do Windows desativado.
Chave RSA 2048 bits (e 65537)
Emissor DigiCert SHA2 Secure Server CA
Algoritmo de assinatura SHA512comRSA
Estes são os requisitos de segurança de transporte de aplicativos:
O servidor deve suportar pelo menos a versão 1.2 do protocolo TLS (Transport Layer Security). As cifras de conexão são limitadas àquelas que fornecem sigilo direto (consulte a lista de cifras abaixo.) Os certificados devem ser assinados usando um algoritmo de hash de assinatura SHA256 ou melhor, com uma chave RSA de 2048 bits ou mais ou uma curva elíptica de 256 bits ou mais. (ECC). Certificados inválidos resultam em falha grave e sem conexão. Estas são as cifras aceitas:
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
O que foi tentado:
- Adicionando exceções no aplicativo móvel para permitir que nosso domínio funcione, mas não quero seguir esse método não seguro, quero corrigir nosso SSL.
- Utilizou o IIS Crypto para usar 'melhores práticas', 'pci' e configurações personalizadas. Até tentou modificar o conjunto de criptografia para apenas a lista acima e reordenar. Após cada tentativa, o servidor é reiniciado e o SSL Labs foi executado (após a limpeza do cache). Consegui passar de uma classificação F para A e até A-, mas isso só resultou no iOS 8 e 9 não conseguirem estabelecer conexões seguras. (Código NSURLErrorDomain = -1200 e _kCFStreamErrorCodeKey = -9806)
- VM restaurada e tentei um script do PowerShell Configure o IIS para SSL Perfect Forward Secrecy e TLS 1.2 Até fiz uma segunda tentativa em que editei os códigos do script de energia para uma lista mínima do que é necessário.
Resultados: sempre similares, classificações de A ou A-. O iOS8 e o iOS9 não podem negociar conexão segura. A Simulação de handshake resulta em "Incompatibilidade de protocolo ou conjunto de cifras" para produtos Safari e iOS.
ATUALIZAÇÃO Depois de trabalhar com o suporte da Apple, fizemos algumas capturas de rastreamento de pacotes:
$ 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
Os três primeiros pacotes são o handshake de três vias clássico SYN - SYN-ACK - ACK que configura a conexão TCP. O quarto pacote é o iOS, enviando ao servidor uma mensagem TLS Client Hello, a primeira etapa na configuração de uma conexão TLS por essa conexão TCP. Separamos esta mensagem e ela parece bastante razoável. No quinto pacote, o servidor simplesmente interrompe a conexão (enviando um RST).
Alguém sabe por que o IIS 7.5 estaria fazendo um RST?