2009-11-29 19 views
11

Tengo dificultades para encontrar una respuesta a mis problemas de asignación de nombres.Cómo obtener información de certificado de aplicación codificada

Tenemos una aplicación para Mac OS escrita bajo Cocoa. Finalmente, hicimos nuestra asignación de nombres, pero me gustaría agregar un control de seguridad adicional, dentro del ejecutable mismo.

Mi idea es validar la huella digital del certificado con el que se ejecuta el ejecutable actual cuando se inicia. Si falta o no es válido (se compara con un hash codificado dentro de la aplicación), lo cerramos.

Hasta ahora, no he podido obtener el certificado utilizado para codificar el ejecutable programáticamente y verificar sus datos.

¿Alguien tiene una pista sobre cómo hacer esto?

¡Muchas gracias! Martin K.

Respuesta

4

Si se dirige a 10.6+, puede utilizar las funciones de firma de código en el marco de seguridad (documentation), en particular SecCodeCheckValidity. De lo contrario, el código fuente del sistema de firma de código está en libsecurity_codesigning.

Dado que utiliza la firma del código para autenticar su código, también debe validar el requisito designado con SecCodeCopyDesignatedRequirement.

8

Gracias amigo!

Logré hacerlo para 10.6 con la nueva funcionalidad, pero el problema es que estoy apuntando a 10.5 y 10.6, al menos hasta que pase el tiempo.

Tengo que invertir un poco más de tiempo en libsecurity_codesigning pronto, así que esto también se puede completar para 10.5.

embargo, para las personas que están en busca de soluciones preparadas por aquí, esto es lo que terminó con:

SecStaticCodeRef ref = NULL; 

NSURL * url = [NSURL URLWithString:[[NSBundle mainBundle] executablePath]]; 

OSStatus status; 

// obtain the cert info from the executable 
status = SecStaticCodeCreateWithPath((CFURLRef)url, kSecCSDefaultFlags, &ref); 

if (ref == NULL) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 
if (status != noErr) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 

SecRequirementRef req = NULL; 

// this is the public SHA1 fingerprint of the cert match string 
NSString * reqStr = [NSString stringWithFormat:@"%@ %@ = %@%@%@", 
    @"certificate", 
    @"leaf", 
    @"H\"66875745923F01", 
    @"F122B387B0F943", 
    @"X7D981183151\"" 
    ]; 

// create the requirement to check against 
status = SecRequirementCreateWithString((CFStringRef)reqStr, kSecCSDefaultFlags, &req); 

if (status != noErr) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 
if (req == NULL) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 

status = SecStaticCodeCheckValidity(ref, kSecCSCheckAllArchitectures, req); 

if (status != noErr) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 

CFRelease(ref); 
CFRelease(req); 

LogDebug(@"Code signature was checked and it seems OK"); 
+0

¡Gracias por compartir! BTW, supongo que NSURL * url = [[NSBundle mainBundle] bundleURL] en la segunda línea se puede utilizar para comprobar la validez de todo el paquete, incluidos los recursos y los archivos ejecutables. ¿Es correcto? – Stream

+0

¿alguna vez hizo que esto funcionara en 10.5? – Richard

+0

No, pero creo que es un poco tarde para eso ahora :) –

0

En la respuesta anterior, la segunda línea debería ser:

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] executablePath]]; 

Si usa la respuesta aceptada (que contiene [NSURL URLWithString:...]), entonces url será nulo si el nombre de su aplicación tiene un espacio o si -executablePath devuelve una ruta que contiene ciertos caracteres. Esto, por supuesto, hará que falle toda la validación.

(Hice esta una segunda respuesta en lugar de un comentario para resaltar la sintaxis.)

Cuestiones relacionadas