
Problema:Nosso aplicativo móvel não consegue mais estabelecer uma conexão segura com nosso serviço web, pois o iOS 9 agora usa ATS.
Fundo: iOS 9 apresenta segurança de transporte de aplicativos
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 SHA512withRSA
Estes são os requisitos de segurança de transporte de aplicativos:
O servidor deve suportar pelo menos o protocolo Transport Layer Security (TLS) versão 1.2. As cifras de conexão são limitadas àquelas que fornecem sigilo de encaminhamento (veja 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 superior ou uma curva elíptica de 256 bits ou superior (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_A ES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
O que foi tentado:
- Adicionar exceções no aplicativo móvel para permitir que nosso domínio funcione, mas não quero seguir esse método inseguro, quero corrigir nosso SSL.
- UsadoCriptografia IISpara usar 'melhores práticas', 'pci' testadas e configurações personalizadas. Até tentei modificar o conjunto de criptografia apenas para a lista acima e reordená-lo. Após cada tentativa, o servidor é reinicializado eLaboratórios SSLfoi executado (depois de limpar o cache). Consegui passar de uma classificação F para A e até A-, mas isso só resultou na incapacidade do iOS 8 e 9 de estabelecer conexões seguras. (Código NSURLErrorDomain=-1200 e _kCFStreamErrorCodeKey=-9806)
- VM restaurada e tentei um script do PowerShellConfigure seu IIS para SSL Perfect Forward Secrecy e TLS 1.2Até fiz uma segunda tentativa em que editei cifras do script avançado para uma lista mínima do que é necessário.
Resultados:Sempre semelhantes, classificações de A ou A-. iOS8 e iOS9 não podem negociar conexão segura. A simulação de handshake resulta em "incompatibilidade de protocolo ou conjunto de criptografia" para produtos Safari e iOS.
ATUALIZARDepois 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 primeiros três pacotes são o clássico handshake de três vias SYN - SYN-ACK - ACK que configura a conexão TCP. O quarto pacote é o iOS enviando ao seu servidor uma mensagem TLS Client Hello, a primeira etapa na configuração de uma conexão TLS por meio dessa conexão TCP. Separei esta mensagem e 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?
Responder1
A pergunta é antiga, mas será encontrada durante a pesquisa. Passei algum tempo para encontrar uma solução para o mesmo problema. Assim, decido escrever a resposta para compartilhar meus resultados com outras pessoas.
Resposta curta: você não deve usar o IIS Crypto para especificar a ordem dos Cipher Suites. Eu recomendo que você clique nos botões "Padrões" para remover a ordem definida anteriormente e, em seguida, use a Política de Grupo ("Configuração do Computador" \ "Modelos Administrativos" \ "Rede" \ "Definições de Configuração SSL") para configurar Cipher Suites por meio da política local.
O motivo do erro "incompatibilidade de protocolo ou conjunto de criptografia" pode ser um dos abaixo:
- seu servidor suporta algum "conjunto de criptografia ruim"
- seu servidor não suporta algum conjunto de criptografia, que DEVE ser compatível com a especificação TLS.
- seu servidor suporta HTTP/2 e possui alguns protocolos doa lista negra acimaos outros protocolos, que não estão na lista. Normalmente é suficiente alterar a ordem dos conjuntos de criptografia para corrigir o problema.
A lista negra exata pode ser diferente em sistemas diferentes. Você pode encontrar na Internet algumas listas negras. Por exemplo,Apêndice Ado RFC 7540 (Protocolo de Transferência de Hipertexto Versão 2 (HTTP/2)) contém uma lista. Os conjuntos de criptografia são TLS_RSA_WITH_AES_128_CBC_SHA
para TLS 1.2 (consulteaqui) e TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
e TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
para TLS 1.3 (consulteaqui). O TLS_ECDHE_ECDSA_*
importante é apenas usar certificados com curvas elípticas. Outro conjunto de criptografia muito bom TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
ainda não foi implementado pela Microsoft. Além disso, você pode considerar adicionar pelo menos TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
suporte à conexão de sistemas antigos e TLS_RSA_WITH_AES_128_CBC_SHA
sistemas muito antigos (Android 2.3.7, , Java 6u45, OpenSSL 0.9.8y) e TLS_RSA_WITH_3DES_EDE_CBC_SHA
somente se precisar de suporte ao IE 8/XP. Assim você pode usar hoje, por exemplo
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
com TLS 1.0 desativado, TLS 1.1para ter melhor segurança ou apenas
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
se você precisa ter boa segurança e o melhor desempenho.
Você pode definir o seguinte conjunto de criptografia, por exemplo, para resolver seu problema:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
Abaixo incluo um exemplo de configuração no Windows 10. Configurei o IIS 10 para terClassificação A+ do Qualys SSL Labs com chave RSA 2048 e certificado SSL gratuito da Let's Encrypt.
Desativei DES 56/56, RC2 128/128, RC2 40/128, RC2 56/128, RC4 128/128, RC4 40/128, RC4 56/128, RC4 64/128, Triple DES 168/168, NULL, MD5, Olá unificado multiprotocolo, PCT 1.0, SSL 2.0, SSL 3.0 e TLS 1.0/1.1manualmente no registro(verKB245030). Desativei os protocolos TLS 1.0 e TLS 1.1 apenas porque TLS_FALLBACK_SCSV (ataque de downgrade) não pode ser evitado no IIS até agora, o que torna impossível obter a classificação A+ dewww.ssllabs.com. Eu vejo isso como uma desvantagem, mas o TLS 1.2 é amplamente suportado atualmente. A propósito, você pode usar DisabledByDefault: 1
, mas Enabled: 1
para TLS 1.0 e TLS 1.1. Poderia ser útil se você executasse o SQL Server 2008/2012 no computador. O servidor web não usará TLS 1.0 e TLS 1.1, mas o SQL Server usa.
O passo mais importante, que toma muito do meu tempo e que é o seu principal problema foi a configuração dos Cipher Suites.Eu fiz isso usando gpedit.msc
. Eu escolhi "Configuração do Computador" \ "Modelos Administrativos" \ "Rede" \ "Configurações de Configuração SSL" e configurei o valor "SSL Cipher Suite Order" para o seguinte
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
A ordem acima pode não ser a ideal e não tenho certeza se todos os protocolos acima são suportados no IIS 7.5 (usei o IIS 10.0 do Windows 10). Porém tenho certeza que seu problema está relacionado com a lista do Cipher Suite, pois tive exatamente o mesmo problema que você descreveu durante meus experimentos com a lista do Cipher Suite.
De qualquer forma, depois de definir as configurações acima em Group Polity ereiniciando o computador( gpupdate /force /target:computer
não foi suficiente em meus testes) Recebi classificações A+ e a seguinte lista de resultados de testes da parte "Simulação de handshake":
Pode-se ver que o iOS é suportado com sucesso pelos seguintes clientes:
Safari 6 / iOS 6.0.1
Safari 7 / iOS 7.1
Safari 8 / iOS 8.4
Safari 9 / iOS 9
Os clientes que não suportam TLS 1.2 agora não parecem tão importantes para mim e acho que a configuração acima é um bom compromisso entre o suporte de clientes legados e o uso de protocolos seguros.
Responder2
Se a sua imagem IIS Crypto for recente, mantenha as configurações como estão, mas habilite SHA, Diffie-Hellman e PKCS. Isso lhe dará a classificação A, mas permitirá a conexão do iOS 8 e inferior.
Responder3
Lutei com isso por alguns dias. Em particular, eu estava me conectando a partir de um aplicativo iOS usando Xamarin Forms PCL para me conectar a um serviço de descanso ASP.NET Web Api 2 com autenticação OAuth2 Bearer Token.
O que funcionou para mim no final foi usar as melhores práticas do IIS Crypto. Em seguida, edite a chave de registro definida para a ordem do conjunto de criptografia:
KEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002\Function
Tive sucesso com o seguinte valor:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P 384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256,TLS_ECDHE_RSA_WITH_AES_256_CB C_SHA_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_256 _CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE _RSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_ COM_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,TLS_RSA _WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521 ,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_RC4_128_SHA,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_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_RC4_128_MD5,TLS_RSA_WITH_DES_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
O último foi encontrado usando Charles Proxy, que negociou TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 automaticamente. O que me levou a isso foi que as conexões foram bem-sucedidas com o Charles Proxy ativado (com os certificados do simulador instalados), mas falharam de outra forma. Adicionar o conjunto usado na negociação resolveu o problema. Parece (?) que o proxy estava renegociando com meu serviço de descanso com algo que era suportado pelo meu servidor, mas não pelo cliente iOS.
Observe que muitos dos conjuntos de criptografia foram obtidos da especificação de conjuntos preferenciais do ssllabs para vários dispositivos iOS/OSX. O valor acima deve ser compatível com tudo, menos com o IE 6 no XPde acordo com ssllabs, com classificação A.