kCFStreamErrorDomainSSL, -9802 cuando se conecta a un server por dirección IP a través de HTTPS en iOS 9

Tenemos una aplicación de iOS que se conecta a nuestro server a través de HTTPS. Cuando la aplicación se crea con el nuevo iOS 9 SDK y se ejecutó con iOS 9, se produce el siguiente error:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 

La aplicación utiliza AFNetworking 1.3.4 con certs fijados. El problema ocurre si me conecto al server con su dirección IP. Funciona si agrego la configuration NSAllowsArbitraryLoads , o si me conecto al server con su nombre de dominio.

El conector Tomcat está configurado con sslEnabledProtocols = "TLSv1, TLSv1.1, TLSv1.2".

He intentado anular el nombre de host pero no parece cambiar nada.

No puedo encontrar mucha documentation oficial sobre ATS todavía. ¿Tal vez se supone que la connection con la dirección IP no funciona?

iOS9 requiere que el server solo admita TLSv1.2 y admita la security avanzada perfecta.

También se requiere que la aplicación sea compatible con IPV6, incluida la no utilización de direcciones IP codificadas. Se sugiere utilizar NSURLSession . De lo contrario, se deben agregar excepciones en la aplicación.

Consulte la session WWDC-15 "Seguridad y sus aplicaciones".

Vea también el blog de Steven Peterson para más detalles.

Puede agregar esto en su file " Info.plist ", permitirá conexiones no seguras:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

Encontré otra respuesta de desbordamiento de stack con una list de verificación de los nuevos requisitos exactos en el server para completar los requisitos pnetworkingeterminados de security de transporte de aplicaciones de iOS 9 : Lista de verificación de requisitos de server de security de iOS 9

Espero que ayude.

Me quedé atrapado en este por un time e intenté todos los trucos en Info.plist pero aún tenía el error:

 HTTP load failed (kCFStreamErrorDomainSSL, -9813) 

cuando intenta conectarse a un server localhost en desarrollo.

Desarrollando localmente con un proyecto nativo reactivo que se conecta a una API que se sirve con un certificate autofirmado, tenía mi sistema configurado para confiar en el certificate, pero me llevó un time darse count de que también necesitaba el simulador IOS para aceptar mi certificate como confiable para pasar este error.

En la pantalla de inicio de su simulador, debe poder arrastrar el file cert al simulador para solicitarle que agregue el perfil del certificate. O bien, si se puede acceder al certificate a través de una URL localhost en el browser de safari del simulador, es posible que pueda aceptarlo mediante safari.

Espero que esto ayude a alguien mientras andaba en círculos antes de que me hiciera clic!

Solución 1:

Si buscas work around , utiliza el siguiente enfoque:

  1. Agregue la tecla NSAllowsArbitraryLoads del tipo boolean con el valor true .

Su file Info.plist debería verse así:

Captura de pantalla 1

Sin embargo, este enfoque no se recomienda ya que permite todas las conexiones no seguras.

Solución 2:

El SSL certificate that you apply on Server should be of type TLSv2.0 minimum since iOS 10 requires this. Consulte este enlace para más detalles.

  1. Agregue la key NSIncludesSubdomains del tipo boolean con el valor true
  2. Agregue NSTemporaryExceptionAllowsInsecureHTTPCarga key del tipo boolean con el valor verdadero
  3. Agregue la key NSTemporaryExceptionMinimumTLSVersion del tipo String con el valor TLSv1.2

Su file Info.plist debería verse así:

Captura de pantalla 2