Cómo conectarse a la auto firmado servidores usando Alamofire 1.3

Me sale el siguiente error al conectar con auto firmado servidor.

Error de Dominio=NSURLErrorDomain Código=-1202 «El certificado para este servidor no es válido. Usted podría estar conectados a un servidor que está pretendiendo ser «maskeddomain.com» que podría poner su información confidencial en riesgo.» UserInfo=0x7fb6dec259e0 {NSURLErrorFailingURLPeerTrustErrorkey=, NSLocalizedRecoverySuggestion=te gustaría conectar con el servidor de todos modos?, _kCFStreamErrorCodeKey=-9813, NSUnderlyingError=0x7fb6dbe0dd90 «La operación no pudo ser completado. (kCFErrorDomainCFNetwork error -1202.)»

Parece Alamofire 1.3 (https://github.com/Alamofire/Alamofire#security) permite deshabilitar esta validación. Alguien ha implementado este? Estoy usando Alamofire de la API en mi swift proyecto, no se donde exactamente «Servidor de Confianza Política Manager» debe ser implementado. Por favor, consejos.

podría publicar algo de código, así que me podía echar un vistazo?

OriginalEl autor Arasan Rajendren | 2015-08-11

5 Kommentare

  1. 22

    Hay una manera de cambiar el Servidor de la Confianza Política de la Alamofire administrador de instancia compartida, pero no es recomendable. En lugar usted debe crear su propio personalizado instancia del administrador. Aquí está la solución recomendada, y el código es Swift 2.0 con Alamofire de swift-2.0 rama, compilado en Xcode7 beta 5.

    La creación personalizada instancia del administrador de

    Porque no va a utilizar el solicitud método en el Alamofire, pero el uso del personalizado del administrador en su lugar, usted necesita pensar de dónde almacenar el gerente. Yo lo que hago es para guardarlo como estática en mi red de contenedor (la clase que utiliza Alamofire y ofertas con mi solicitud de necesidades de red). Lo configuro como este:

    private static var Manager : Alamofire.Manager = {
            //Create the server trust policies
            let serverTrustPolicies: [String: ServerTrustPolicy] = [
                "maskeddomain.com": .DisableEvaluation
            ]
            //Create custom manager
            let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
            configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
            let man = Alamofire.Manager(
                configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
                serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
            )
            return man
        }()

    Siguiente paso es cambiar todas las llamadas que utilizan Alamofire.request() con Manager.request(), así que usted debe tener algo como esto:

    Manager.request(.GET, "http://stackoverflow.com").responseJSON(
        completionHandler: { (_, respose, result) -> Void in
                if result.isSuccess {
                    //enjoy your success
                } else if result.isFailure {
                    //deal with your failure
                }
        })

    Si quieres cambiar la instancia compartida de que el administrador de todos modos, ir aquí para obtener más información.

    No debería ser let man = Alamofire.Manager(configuration: configuration, serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)) ?

    OriginalEl autor lawicko

  2. 35

    Administrador de configuración para Swift 3 o Swift 4 y Alamofire 4:

    private static var manager: Alamofire.SessionManager = {
    
        //Create the server trust policies
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "test.example.com": .disableEvaluation
        ]
    
        //Create custom manager
        let configuration = URLSessionConfiguration.default
        configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
        let manager = Alamofire.SessionManager(
            configuration: URLSessionConfiguration.default,
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )
    
        return manager
    }()
    thx por salvar mi tiempo.

    OriginalEl autor jonaszmclaren

  3. 12

    Un ejemplo es enviado a la derecha en la LÉAME demostrar exactamente cómo deshabilitar la evaluación de si usted necesita para hacerlo.

    Puesto que usted va a necesitar para crear tu propio Manager instancia así, usted querrá hacer algo como lo siguiente:

    class NetworkManager {
        static let sharedInstance = NetworkManager()
    
        let defaultManager: Alamofire.Manager = {
            let serverTrustPolicies: [String: ServerTrustPolicy] = [
                "test.example.com": .PinCertificates(
                    certificates: ServerTrustPolicy.certificatesInBundle(),
                    validateCertificateChain: true,
                    validateHost: true
                ),
                "insecure.expired-apis.com": .DisableEvaluation
            ]
    
            let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
            configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
    
            return Alamofire.Manager(
                configuration: configuration,
                serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
            )
        }()
    }

    Esto le permitirá hacer peticiones con el NetworkManager.sharedInstance.defaultManager objeto.

    Gracias cnoon para mirar a mi problema. Sí, yo lea el archivo README pero estoy un poco confundido sobre cómo debe ser implementado (soy nuevo en el Swift). Según la documentación de un nuevo Administrador objeto se inicializa con configurada serverTrustPolicyManager. Sin embargo, en mi caso, estoy utilizando el valor predeterminado sharedInstance como el de abajo… Alamofire.solicitud(DeviceAPIRequest.GEN_USER_TOKEN()).validate().responseJSON() { (request, response, resultados, error) en } El método anterior, se utiliza el sharedInstance del Administrador de objetos. Puede usted por favor me guía sobre cómo debe ser anulada?
    Usted necesita para crear su propio personalizado manager instancia. Esta es la manera más fácil y segura para que usted utilice un ServerTrustPolicy. Hay maneras de utilizar todavía la Alamofire singleton Manager instancia, pero definitivamente no es recomendable. Voy a actualizar mi respuesta con un poco más de información.
    Gracias cnoon… voy a crear mi propio ejemplo.. por Favor proporcione cualquier información adicional disponible, será útil para mí, para que se entienda mejor
    Para un certificado auto-firmado, es necesario .disableEvaluation completamente, o hay otra configuración posible que acepta la auto-firmado?
    usted tendrá que utilizar .DisableEvaluation. No hay ningún concepto de los certificados auto-firmados. Ellos no son válidos, ya que no está firmado por una entidad emisora raíz de confianza. Si usted necesita un poco más el comportamiento personalizado, entonces usted podría tirar de su propio con el .CustomEvaluation caso.

    OriginalEl autor cnoon

  4. 3

    Otro enfoque para mi proyecto. El ServerTrustPolicyManager es un open clase, y es serverTrustPolicy función es open demasiado. Por lo que se puede reemplazar.

    //For Swift 3 and Alamofire 4.0
    open class MyServerTrustPolicyManager: ServerTrustPolicyManager {
    
        //Override this function in order to trust any self-signed https
        open override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {
            return ServerTrustPolicy.disableEvaluation
    
            //or, if `host` contains substring, return `disableEvaluation`
            //Ex: host contains `my_company.com`, then trust it.
        }
    }

    Entonces,

        let trustPolicies = MyServerTrustPolicyManager(policies: [:])
        let manager = Alamofire.SessionManager(configuration: sessionConfig, delegate: SessionDelegate(), serverTrustPolicyManager: trustPolicies)

    ACTUALIZACIÓN de @2018,01

    A fin de activar la ServerTrustPolicyManager, el proyecto del Info.plist necesita ser configurado. He encontrado la solución, detalle en este post, cnoon comentario de @ 1 Nov 2015.

    Cómo conectarse a la auto firmado servidores usando Alamofire 1.3

    Por ejemplo, si hay direcciones url con nombre site1.foo.com, site2.foo.com, ….
    A continuación, agregue App Transport Security Settings -> Exception Domains -> foo.com diccionario, con las siguientes entradas.

    • NSExceptionRequiresForwardSecrecy : NO
    • NSExceptionAllowsInsecureHTTPLoads : SÍ
    • NSIncludesSubdomains : SÍ

    Más detalles puede consultar el post.

    OriginalEl autor AechoLiu

  5. 1

    De todos modos, la respuesta de @cnoon casi por completo. Pero me encontré con otro problema de la validación ssl, por lo que quiero poner mi código aquí por si alguien puede conseguir la ayuda de la ti.El administrador de init:

    private var manager: Manager?
    //Import the certificates like xxx.cer to your project(anywhere will be fine), then the ServerTrustPolicy.certificatesInBundle() can find them
    let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
                certificates: ServerTrustPolicy.certificatesInBundle(),
                validateCertificateChain: false,
                validateHost: true
            )
    let serverTrustPolicies: [String : ServerTrustPolicy] = [
                "sub.server.com": .DisableEvaluation, //because the certificates only add the main domain, so disable evaluation for subdomain
                "192.168.0.2:8090": .DisableEvaluation, //the IP address for request data
                "www.server.com": serverTrustPolicy
            ]
    manager = Manager(serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))

    A continuación, utilice el administrador de solicitud:

    //this function in the class which for manager the Alamofire request
    public func request(method: Alamofire.Method, _ URLString: URLStringConvertible,
                            parameters: [String : AnyObject]?) -> Alamofire.Request
        {
            //we do not need use Alamofire.request now, just use the manager you have initialized
            return manager!.request(method, URLString, parameters: parameters,
                                     headers: ["tokenId": UserManager_Inst.tokenID])
        }

    p.s.: es el swift 2.3 muestra

    OriginalEl autor Raniys

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea