ssl ios9 tls1.2

Descarga de la aplicación iOS 9 del error SSL de Amazon S3: compatibilidad con TLS 1.2



ios9 tls1.2 (5)

yo obtengo

Se ha producido un error de SSL y no se puede establecer una conexión segura con el servidor.

en iOS 9 si intento descargar un archivo desde Amazon s3: https://s3.amazonaws.com/xyz/qer/IMG_0001.JPG

Por lo que entiendo, Amazon s3 admite TLS 1.2, consulte: https://forums.aws.amazon.com/thread.jspa?threadID=192512

S3 y Kinesis son compatibles con TLS 1.2 en este momento.

"S3 y Kinesis son compatibles con TLS 1.2 en este momento". 23 de agosto de 2015 a las 21:19

No estoy seguro, ¿por qué recibo este error de SSL? La cuenta debe configurarse para aprovechar TLS 1.2? Supondría que esto debería estar ''encendido'' por defecto.

No quiero poner este dominio en la lista de información.

EDIT: Terminé usando

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>s3.amazonaws.com</key> <dict> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>


Dado que S3 no es totalmente compatible en mobile.awsblog.com/post/Tx2QM69ZE6BGTYX/… , según mobile.awsblog.com/post/Tx2QM69ZE6BGTYX/… en el blog de AWS, su recomendación oficial es excluir S3 de la seguridad del transporte de aplicaciones al agregar este conjunto de claves a su Info.plist :

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>amazonaws.com</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> <key>amazonaws.com.cn</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>

ACTUALIZACIÓN 27/10/2015: como señala Pol en los comentarios, aunque esta es una respuesta oficial de AWS, un ingeniero de Apple en forums.developer.apple.com/thread/13472 dice que esto es en realidad un error:

Resulta que el hecho de que NSExceptionRequiresForwardSecrecy relaje el requisito SHA-2/256 es un error; el comportamiento previsto de NSExceptionRequiresForwardSecrecy es el comportamiento documentado en la Técnica de seguridad de transporte de aplicaciones, es decir, que solo debe habilitar suites de cifrado específicas.

Nuestro plan es solucionar este error en algún momento en el futuro. Esperamos solucionar esto de alguna manera compatible, por lo que las personas que hayan usado erróneamente NSExceptionRequiresForwardSecrecy para desactivar el requisito SHA-2/256 no se romperán . Sin embargo, predecir el futuro siempre es un desafío. Lo que nos lleva a lo que deberías hacer en este momento. [Una versión anterior de esta publicación dio consejos menos concretos. La siguiente es una actualización que refuerza las cosas.] Después de discutir esto con ATS Engineering, nuestras recomendaciones son:

Si está utilizando un servicio de alojamiento específico, debe consultar su servicio de alojamiento para obtener los últimos consejos.

En situaciones como esta, donde el servidor es totalmente compatible con ATS, excepto por el requisito de firma de certificado SHA-2/256, recomendamos que documente con precisión ese estado de cosas utilizando NSExceptionAllowsInsecureHTTPLoads.

Debe intentar hacer que su servidor sea totalmente compatible con ATS lo antes posible.

Cuando eso sucede, debe actualizar su aplicación con la configuración ATS más segura.

Debo enfatizar que NSExceptionAllowsInsecureHTTPLoads no es realmente inseguro. Es tan seguro como su aplicación actual cuando se ejecuta en iOS 8. Más bien, significa que su aplicación no se beneficia de la seguridad adicional proporcionada por ATS. Comparte y Disfruta

Énfasis mío Tenga en cuenta que el plan actual es corregir el error de una manera que no rompa el comportamiento de las personas que han usado NSExceptionRequiresForwardSecrecy para resolver este problema, por lo que lo anterior sigue siendo una respuesta viable.


Necesitas dos cosas para que la aplicación iOS 9 alcance con éxito el punto final SSL (S3 es solo un ejemplo):

  • Forward Secrecy ( https://www.wikiwand.com/en/Forward_secrecy ) habilitado en el servidor.

    Esta característica actualmente no es compatible con AWS S3 . La solución para eso es que puede configurar el servicio AWS CloudFront (que admite FS) en frente de su segmento S3. La configuración es bastante fácil. Si está utilizando CORS, tenga en cuenta que los encabezados adecuados deben pasar a través del proxy de CloudFront.

  • Certificado SSL protegido SHA-256 en el servidor.

    Una vez que tenga sus archivos disponibles a través de Cloudfront, al presionar la URL ( https://somethinghashed1234wasdfawer421.cloudfront.net ) notará que el certificado SSL de allí usa SHA-1. Qué malo ... La solución para eso es proteger esto con su certificación privada, SHA-256 SSL. Para hacerlo, debe especificar CNAME para el punto final de Cloudfront en su dominio. Esto le permitirá asegurar el depósito con su propio certificado SSL. Simplemente configure su DNS para que la entrada señale cloudfront-bucket.mydomain.com a ese feo somethinghashed1234wasdfawer421.cloudfront.net. Suba su certificado SSL a Amazon y configure la protección SSL en la configuración de distribución de Cloudfront. Voila!

Todas las cosas mencionadas se pueden hacer clic fácilmente desde la consola de AWS (además de cargar el certificado SSL, lo que debe hacerse a través de AWS CLI).


Solo publico para señalar que el problema con los certificados de Amazon es que usan SHA-1 y la seguridad de transporte de la aplicación requiere SHA-2/256.

El hecho de que NSExceptionRequiresForwardSecrecy funcione es un error documentado aquí en forums.developer.apple.com/thread/13472 . De acuerdo con la documentación y un ingeniero de Apple en el hilo vinculado, una "mejor" solución sería

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>s3.amazonaws.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>

Utilizo el término "mejor" muy vagamente y solo me refiero a una solución que no ejerce un error que Apple finalmente solucionará. Ahora esta es una solución para el problema del certificado solamente :)


Edición 2016-01-03: el certificado renovado para s3.amazonaws.com utiliza el algoritmo SHA256 y cumple con los requisitos ATS.

Respuesta original: s3.amazonaws.com utiliza un certificado de SHA1 que no cumple con los requisitos de ATS, lo que resulta en una falla grave. Según la App Transport Security Technote , ATS en iOS9 tiene los siguientes requisitos:

  1. El servidor debe admitir al menos la versión 1.2 del protocolo Transport Layer Security (TLS).

  2. Las cifras de conexión están limitadas a aquellas que proporcionan secreto hacia adelante, es decir,

    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

  3. Los certificados deben estar firmados con un algoritmo SHA256 o mejor algoritmo hash de firma, con una clave RSA de 2048 bit o superior o una clave de curva elíptica (ECC) de 256 bit o superior.

Los certificados no válidos dan como resultado una falla grave y ninguna conexión.

La prueba del servidor SSL de SSL Labs ( https://www.ssllabs.com/ssltest/analyze.html?d=s3.amazonaws.com ) incluye una simulación de apretón de manos para ATS en iOS 9 que indica una falla para s3.amazonaws.com .


Hasta Amazon obtiene su cabeza de su * ss en este caso , como @Zsolt sugirió insertar las siguientes claves y valor en su archivo plist.

PERO asegúrese de establecer NSExceptionDomain en amazonaws.com en lugar de s3.amazonaws.com, dependiendo de cómo se sirven sus activos y de qué región Amazon puede servirles, como este s3-us-west-1.amazonaws.com , por lo que no establecer explícitamente el subdominio permitirá que los activos se atiendan adecuadamente desde cualquier identificador de región AWS.

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>amazonaws.com</key> <dict> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>