Как декодировать серийный номер, информацию об эмитенте и т. Д. Из сертификата, присутствующего в связке ключей под iOS?
Я создаю приложение для iOS, которое может получать информацию о сертификате (.cer), присутствующем в цепочке для ключей.
Ссылочные ссылки: Link1, Link2
Ниже приведен код:
const char *certLabelString = "Certificates";
CFStringRef certLabel = CFStringCreateWithCString(
NULL, certLabelString,
kCFStringEncodingUTF8);
const void *keys[] = { kSecClass, kSecAttrLabel, kSecReturnAttributes };
const void *values[] = { kSecClassCertificate, certLabel, kCFBooleanTrue };
CFDictionaryRef dict = CFDictionaryCreate(NULL, keys,
values, 3,
NULL, NULL)
if ((SecItemCopyMatching(dict, &myCertData)) == errSecSuccess){
NSLog(@"Certificate found");
CFDictionaryRef dictCertificateRef = (CFDictionaryRef)myCertData;
NSDictionary *dictCertificate = (__bridge NSDictionary *)dictCertificateRef;
NSLog(@"%@",dictCertificate);
}
Выход:
Я получил данные сертификатов, но я вижу серийный номер или имя эмитента в зашифрованном виде.
Как это: ISSR = <310b3009 06035504 06130255 53311330 11060355 040a0c0a 4170706c 6520496e 632e312c 302a0603 55040b0c 23417070 6c652057 6f726c64 77696465 20446576 65722052 656c6f70 656c6174 696f6e73 31443042 06035504 030c3b41 70706c65 20576f72 6c647769 64652044 6576656c 6f706572 2052656c 6174696f 6e732043 65727469 66696361 20417574 74696f6e 686f7269 7479>;
Может кто-нибудь сказать, пожалуйста, как расшифровать эту информацию?
1 ответ
Мне также было бы интересно узнать это. Пока, осматривая сертификат, я сделал следующее:
id data = [keychainDictionary objectForKey: @ "issr"];
Затем вы можете установить точку останова в этой строке и, переступая через нее, выбрать переменную "data" в левой панели окна отладки. Выберите "смотреть память * данных", и вы увидите кучу мусора с реальными строками из этих данных. Я не знаю, как действовать дальше.
Полный метод, который получает все элементы цепочки для ключей и загружает их в табличное представление:
-(void)loadDataSource
{
//enumerate all items in keychain http://stackru.com/questions/10966969/enumerate-all-keychain-items-in-my-ios-application
NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:
(__bridge id)kCFBooleanTrue, (__bridge id)kSecReturnAttributes,
(__bridge id)kSecMatchLimitAll, (__bridge id)kSecMatchLimit,
nil];
NSArray *secItemClasses = [NSArray arrayWithObjects:
(__bridge id)kSecClassGenericPassword,
(__bridge id)kSecClassInternetPassword,
(__bridge id)kSecClassCertificate,
(__bridge id)kSecClassKey,
(__bridge id)kSecClassIdentity,
nil];
NSMutableArray* results = [NSMutableArray array];
for(int i = 0; i < (int)secItemClasses.count;i++)
{
[results addObject:[NSMutableArray array]];
}
for (id secItemClass in secItemClasses) {
[query setObject:secItemClass forKey:(__bridge id)kSecClass];
CFTypeRef result = NULL;
SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);
// NSLog(@"%@", (__bridge id)result);
if (result != NULL)
{
NSMutableArray* thisSection = results[[secItemClasses indexOfObject:secItemClass]];
[thisSection addObject:(__bridge id)result];
// [results addObject:(__bridge id)result];
CFRelease(result);
}
for(NSArray* object in results[[secItemClasses indexOfObject:secItemClass]])
{
DLog(@"object is of class: %@",[[object class] description]);
for (NSDictionary* innerObject in object)
{
DLog(@"object is of class: %@",[[innerObject class] description]);
}
}
}
self.datasource = results;
[self.tableView reloadData];
}
// это описание, вы можете присвоить его текстовой метке в ячейке табличного представления
-(NSMutableString*)descriptionForObject:(NSDictionary*)object
{
NSMutableString* string = [[NSMutableString alloc] initWithCapacity:1024];
// https://developer.apple.com/library/mac/documentation/security/Reference/keychainservices/Reference/reference.html
//search for kSecAlias for a list of codes
if(object[@"labl"] != nil)
{
[string appendString:[NSString stringWithFormat:@"Label: %@\n",object[@"labl"]]];
}
[string appendString:[NSString stringWithFormat:@"Created at: %@\n",object[@"cdat"]]];
if(object[@"agrp"] != nil)
{
[string appendString:[NSString stringWithFormat:@"Belongs to application: %@\n",object[@"agrp"]]];
}
for(NSString* key in @[@"issr",@"subj"])
{
id data = [object objectForKey:key];
@try {
if([data isKindOfClass:[NSData class]]==NO)
{
continue;
}
NSString* stringAscii = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSCharacterSet* alphaNumeric = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.@"];
NSCharacterSet *doNotWant = [alphaNumeric invertedSet];
NSString* cleanedUpString = [[stringAscii componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @" "];
if(cleanedUpString.length>0)
{
DLog(@" %@ Cleaned up: %@",key,cleanedUpString);
[string appendString:[NSString stringWithFormat:@" %@ Cleaned up: %@",key,cleanedUpString]];
}
}
@catch (NSException *exception) {
}
@finally {
}
}
// [string appendString:[NSString stringWithFormat:@"Complete description:(%@)\n", [object description]]];
return string;
}