sufrido - iOS 9.3: se ha producido un error de SSL y no se puede establecer una conexión segura con el servidor
itunes no pudo establecer conexión con este iphone (4)
Estoy recibiendo error siguiente con certificado autofirmado
Dominio de error = NSURLErrorDomain Code = -1200 "Se produjo un error de SSL y no se puede establecer una conexión segura con el servidor.
mientras probaba servicios web para una de mis aplicaciones de demostración con
- iOS 9.3
- XCode 7.3
- Swift 2.2
- Alamofire 3.3.0
- y servidor local: https://filename.hostname.net
Nota: antes de asumir su Duplicado, solicito que lo lea todo el camino, incluso he informado a los foros de Apple Dev.
Usando la biblioteca de Alamofire
func testAlamofireGETRequest() -> Void
{
Alamofire.request(.GET, "https://filename.hostname.net/HelloWeb/service/greeting/john")
.responseJSON
{ response in
print("Response JSON: /(response.result.value)")
}
}
Utilizando NSURLSession
func testNSURLSessionRequest() -> Void {
let session = NSURLSession.sharedSession()
let urlString = "https://filename.hostname.net/HelloWeb/service/greeting/john"
let url = NSURL(string: urlString)
let request = NSURLRequest(URL: url!)
let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
print("done, error: /(error)")
//Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made.
}
dataTask.resume()
}
Pasé 2 días sin suerte :(
Hay un montón de preguntas ya publicadas pero nada me funcionó.
- Seguridad de transporte ha bloqueado un HTTP de texto simple
- iOS9 recibe el error "se ha producido un error de SSL y no se puede establecer una conexión segura con el servidor"
- ¿Cómo puedo cargar una URL HTTP con la seguridad de transporte de aplicaciones habilitada en iOS 9? [duplicar]
- CFNetwork SSLHandshake falló iOS 9
- Cómo manejar "CFNetwork SSLHandshake failed" en iOS
- Realización de solicitud HTTPS en iOS 9 con certificado autofirmado
- Certificado autofirmado ios9 y seguridad de transporte de aplicaciones
publicado Alamofire git problema
- Error ''CFNetwork SSLHandshake failed (-9847)'' al realizar una solicitud no SSL # 538
- Certificado autofirmado no aceptado # 876
- ¿Cómo puedo conectar mi servidor como HTTPS utilizando el archivo de certificado autofirmado n. ° 977?
Mi archivo Info.pist se actualiza para la configuración ATS de esta manera
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>filename.hostname.net</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
Mientras tanto soy capaz de obtener respuesta para
http : // nombre de archivo.
y https : //google.com
pero no para https : //filename.hostname.net
¿Alguien puede sugerirme por qué no puedo hacer que esto funcione después de grandes esfuerzos?
Apple ha lanzado la lista completa de requisitos para la Seguridad de transporte de aplicaciones.
Resultó que estábamos trabajando con TLS v1.2 pero faltaban algunos de los otros requisitos.
Aquí está la lista de verificación completa :
- TLS requiere al menos la versión 1.2.
- Los cifrados de conexión están limitados a aquellos que brindan secreto hacia adelante (consulte a continuación la lista de cifrados).
- El servicio requiere un certificado que use al menos una huella dactilar SHA256 con una clave RSA de 2048 bits o superior, o una clave de curva elíptica (ECC) de 256 bits o más.
- Los certificados no válidos dan como resultado un error de hardware y ninguna conexión.
- Los sistemas de cifrado aceptados son:
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
En la línea de comandos en OS X, ejecute lo siguiente:
nscurl --ats-diagnostics https://filename.hostname.net --verbose
Esto le dirá qué combinaciones de configuración ATS permitirá y no permitirá que iOS acceda a su sitio, y le indicará qué es lo que está mal en su sitio.
Podría ser uno o más de los siguientes
- Algoritmo de hash del certificado (debe ser SHA-256 o superior)
- Versión TLS (debe ser 1.2)
- Algoritmos TLS (debe proporcionar secreto perfecto hacia adelante)
Supongo que el servidor al que intenta conectarse tiene certificados no válidos o no coincide con los estándares de iOS 9 para ECC, cifrados, etc.
Si está utilizando API de red de alto nivel (NSURLSession, NSURLConnection, o cualquier otra cosa superpuesta a esas), no tiene control directo sobre las suites de cifrado que ofrece el cliente. Esas API eligen un conjunto de suites de cifrado utilizando su propia lógica interna.
Si está utilizando API de red de nivel inferior (CFSocketStream, a través de sus API NSStream y CFStream, y cualquier otra cosa inferior), puede elegir explícitamente el conjunto de suites de cifrado que desea usar. Cómo haces esto depende de la API específica.
La práctica estándar es:
crear el par de secuencias
configurarlo para TLS
obtener el contexto de transporte seguro utilizando la propiedad kCFStreamPropertySSLContext
configurar propiedades específicas en ese contexto
abre los arroyos
Puede ver un ejemplo de esto en el código de ejemplo de TLSTool. Específicamente, observe la clase TLSToolServer , donde puede ver exactamente esta secuencia.
En un contexto muy corto, desea configurar el flujo de manera que evite la seguridad, sin embargo, en el caso de Alamofire, puede hacerlo directamente mediante:
func bypassAuthentication() {
let manager = Alamofire.Manager.sharedInstance
manager.delegate.sessionDidReceiveChallenge = { session, challenge in
var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling
var credential: NSURLCredential?
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
disposition = NSURLSessionAuthChallengeDisposition.UseCredential
credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)
} else {
if challenge.previousFailureCount > 0 {
disposition = .CancelAuthenticationChallenge
} else {
credential = manager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)
if credential != nil {
disposition = .UseCredential
}
}
}
return (disposition, credential)
}
}
Déjame saber si eso ayuda. ¡Gracias!
Tuve el mismo escenario y me quedé atascado por un día. Intente con sus datos móviles, si esto funciona bien con su API, entonces hay un problema con el firewall de su red. luego habilite SSL / TLS desde la configuración del firewall.