2009-08-09 20 views
6

Actualmente abro una conexión https a un servidor web usando NSURLConnection. Todo funciona como debería y puedo recuperar el contenido de la página que estoy buscando. El certificado es emitido por VeriSign y supongo que NSURLConnection hace algún trabajo para verificar la autenticidad del certificado hasta cierto punto. Si me conecté al mismo sitio web a través de un safari móvil, extraería del certificado y mostraría la Organización (del sitio web) en la barra de navegación. ¿Es posible extraer estos mismos detalles en Cocoa Touch ya que también me gustaría presentarlos al usuario? ¿Verificaría también que el nombre de host del servidor contra ese certificado fuera lo suficientemente razonable como para asumir que el sitio web es legítimo?¿Cómo verificar un certificado de sitio web en Cocoa Touch?

Respuesta

5

NSURLConnection le dará un error (NSURLErrorDomain) si intenta conectarse a un servidor con un certificado no válido (por ejemplo, que está firmado uno mismo, fuera de fecha, tiene el host incorrecto, etc.). Por lo tanto, no es necesario que realice ninguna verificación usted mismo, ya que todo se maneja para usted.

Si realmente desea/necesita mostrar un resumen de certificado SSL en su UI, tendrá que desplegar una capa desde NSURLConnection y utilizar en su lugar CFNetwork API de bajo nivel. Una vez que tenga un CFReadStreamRef que está en el estado kCFStreamEventEndEncountered, usted debería ser capaz de hacer lo siguiente (suponiendo que su referencia de flujo se llama readStream):

NSArray* certificates = [(NSArray*)CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates) autorelease]; 
if ([certificates count] > 0) { 
    SecCertificateRef certificate = (SecCertificateRef)[certificates objectAtIndex:0]; 
    NSString* description = [(NSString*)SecCertificateCopySubjectSummary(certificate) autorelease]; 
    NSData* data = [(NSData*)SecCertificateCopyData(certificate) autorelease]; 
} 

Tendrá que decodificar la información contenida en data si quieres para acceder a las diversas propiedades del certificado, pero el resumen que se encuentra en description podría ser suficiente para sus propósitos.

+1

Gracias por la ayuda Nathan, dejando caer una capa como usted sugirió el truco! Aunque en realidad no es un problema, ¿su NSDictionary * cast no debería ser un NSArray *? – dbotha

+0

¿Sería capaz de publicar un código de muestra Deon? – Pripyat

+0

@Deon ¡Lo tienes! He actualizado el código de muestra. –

Cuestiones relacionadas