ios - app - NSURLSession "Falló la carga HTTP kCFStreamErrorDomainSSL,-9813; Certificado de firma automática
ssl ios (7)
Estoy intentando conectar mi aplicación iOS a una aplicación HTTPS Rails que actualmente se ejecuta en un host local en mi red. Puedo acceder al sitio desde mi navegador con https://myIP:3000/display
, así como en la línea de comandos con una solicitud curl. Estoy intentando acceder desde mi aplicación usando:
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//let url = NSURL(string: "https://another/Sinatra/website/feed")
let url = NSURL(string: "https://myIP:3000/display")
let request = NSURLRequest(URL: url!)
let task = NSURLSession.sharedSession().dataTaskWithURL(url!)
task!.resume()
}
Cuando intento acceder al sitio web de Sinatra, no tengo problemas e incluso puedo imprimir el JSON en la consola con los comandos correctos. Sin embargo, cuando configuro la URL en el sitio web de Rails, aparece el siguiente error.
Error en la carga de NSURLSession / NSURLConnection HTTP (kCFStreamErrorDomainSSL, -9813)
Además, puedo decir que mi aplicación localhost Rails (en la otra máquina) no está activada desde la aplicación de iOS, sino que está activada desde el navegador y el comando curl.
Alguna idea de cómo solucionar este problema?
Esta es la única solución que funcionó para mí ... Al final de su archivo AppDelegate.m, inserte el código:
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
Gracias por el artículo de jc ivancevich http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/
Este es un problema de confianza. Con un certificado autofirmado, el componente de verificación de identidad de SSL no funciona. Todavía es posible establecer una conexión segura para que nadie esté escuchando a escondidas, pero la aplicación no puede estar segura de quién está al otro lado de la línea.
Tengo una configuración similar y resolví este problema agregando mi CA raíz autofirmada a los certificados de confianza del iPad. Esta CA raíz se utiliza para firmar todos mis otros certificados de desarrollo. Entonces solo tengo que agregar este certificado raíz único en cualquier lugar donde se use SSL. Si solo tiene un certificado autofirmado que está utilizando directamente, probablemente pueda simplemente agregarlo.
Para obtener el certificado en el dispositivo (o simulador), coloco el archivo en mi servidor web. Luego solo ábrelo en Safari a través de HTTP simple. La aplicación Configuración debería abrirse y preguntar si quieres confiar en el certificado.
Por supuesto, esto supone que esto es solo para el desarrollo y que su sistema de producción tiene un certificado firmado por una autoridad conocida (es decir, uno incluido en la base de datos del sistema operativo de las autoridades de certificación raíz). Debido a que no se volará a los usuarios finales para que instalen su certificado autofirmado.
La modificación del info.plist funcionó para mí también.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Si entendí bien, Apple ahora quiere que los desarrolladores usen HTTPS y TLS 1.2 para llamadas de red.
Temporal , puede agregar esto en su archivo "Info.plist":
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Simplemente eche un vistazo a este enlace, también puede ayudarlo: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/
-
Actualización : después de algunos comentarios, la solución anterior ya no funciona. Aquí hay una solución actualizada.
- Vaya a su archivo
Info.plist
. - Agregue una fila de Type
Dictionary
y de KeyApp Transport Security Settings
. - En este Diccionario, agregue una fila de Tipo
Boolean
, de ClaveAllow Arbitrary Loads
y de ValorYES
-
De lo contrario, puede establecer Domain Exceptions
. Esta es la forma de hacerlo:
- Vaya a su archivo
Info.plist
. - Agregue una fila de Type
Dictionary
y de KeyApp Transport Security Settings
. - Agregue una fila de Type
Dictionary
y de KeyException Domains
. - Agregue una fila de Type
Dictionary
y de KeyThe domain
. - Agregue dos filas de Tipo
Boolean
y de KeyNSExceptionAllowsInsecureHTTPLoads
&NSIncludesSubdomains
con valor aYES
.
Campo de golf
http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/
intenta cambiar la variable de la sesión, este cambio me ayuda
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
(Editar - Leí mal este 9814, cert vencido. No estoy seguro de cómo resolverlo, pero espero que mi respuesta ayude a apuntar en la dirección correcta).
Parece una cuestión de certificación diferente de la habitual pregunta "Permitir cargas arbitrarias".
Breve extracto de: Documentación de Apple - Apéndice A: Errores comunes de evaluación de la confianza del servidor
NSOSStatusErrorDomain errSSLNoRootCert -9813