2010-06-11 7 views
10

Tengo una aplicación que se está comunicando con muchos sitios diferentes y cada sitio tiene su propio certificado SSL firmado por nuestra propia CA interna. Hacer esto nos evita la necesidad de comprar certificados SSL para cada sitio (cientos o miles) y es más seguro que usar un certificado comodín con una clave compartida en cada uno de esos sitios. Entonces, básicamente usar un certificado de CA es la única manera.certificado de CA personalizada de iPhone para una aplicación que utiliza NSURLConnection?

Ahora mismo, tengo un archivo de provisión móvil que instalará el certificado de CA como un perfil en el teléfono. Cuando nuestra aplicación para iPhone se lance si obtiene un error de certificado SSL, redirecciona a este archivo de provisión móvil a través de Safari y se le solicitará al usuario que instale la CA.

El problema es que me preocupa que Apple AppStore pueda denegar mi aplicación por hacer esto (solo algunos comentarios de otros desarrolladores en este punto), y quería investigar otras formas de lograr esto.

Básicamente lo que necesito lograr es permitir una conexión SSL que verificará contra un certificado de CA personalizado que se integrará en mi aplicación. Esto hará que el certificado de CA esté activo solo para las llamadas que realizo. Estoy utilizando los métodos estándar de NSURLConnection para comunicarme con el servicio.

¿Esto es posible? ¿Puede alguien mostrarme cómo cargar la CA (qué forma PEM?) Y agregarla a la lista de certificados de CA confiables para mi aplicación. Si eso no es posible, ¿qué otras opciones tengo? Confiar en todos los certificados no es realmente una opción, queremos evitar los ataques intermedios y solo confiar en nuestros certificados emitidos por CA.

Gracias!

+1

-1 sin un comentario. ¡bonito! –

Respuesta

1

Usar el siguiente método de dos delegado de NSURLConnection para acceder a cualquier sitio con certificado no válido

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
    { 

      NSLog(@"canAuthenticateAgainstProtectionSpace"); 
     if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
      // Note: this is presently only called once per server (or URL?) until 
      //  you restart the app 
       NSLog(@"Authentication checking is doing"); 
      return YES; // Self-signed cert will be accepted 
      // Note: it doesn't seem to matter what you return for a proper SSL cert 
      //  only self-signed certs 
     } 
     return NO; 
    } 

    - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
    { 
      NSLog(@"didReceiveAuthenticationChallenge"); 
     if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
     { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
       NSLog(@"chalenging protection space authentication checking"); 
     } 
    } 
+0

Actualmente los he implementado pero no se los llama :([NSURLRequest setAllowsAnyHTTPSCertificate: YES forHost: [[NSURL URLWithString: url] host]]; – jsetting32

Cuestiones relacionadas