Как сгенерировать значение ds: X509Certificate из .p12 в Objective-C?

У меня есть файл закрытого ключа .p12.
Я использую Objective-C.

Мне нужно сгенерировать Подписанную цифровую подпись XML следующим образом:

введите здесь описание изображения

Проблема в том, что я не могу понять, как сгенерировать значение в <ds:X509Certificate>. Я знаю, что это открытый ключ, закодированный в base64. Но я не могу получить ту же строку после тестирования различных методов кодирования..

Нужна ваша помощь!


person Almas Adilbek    schedule 23.07.2014    source источник
comment
Сертификат X509 — это открытый ключ + все остальные части, входящие в сертификат. Вы используете сертификат в сертификате X509 или что-то еще?   -  person pd40    schedule 24.07.2014
comment
@pd40 все, что у меня есть, это .p12; Мне удалось извлечь из него сертификат и ключ.   -  person Almas Adilbek    schedule 24.07.2014


Ответы (1)


Сам нашел решение. Это так просто.

Использование Apple security.framework:

NSString* pfile = [[NSBundle mainBundle] pathForResource:@"rsa_user" ofType:@"p12" ];

// Load Certificate
NSData *p12data = [NSData dataWithContentsOfFile:pfile];
CFDataRef inP12data = (__bridge CFDataRef)p12data;

SecIdentityRef myIdentity;
SecTrustRef myTrust;
extractIdentityAndTrust(inP12data, &myIdentity, &myTrust);

SecCertificateRef myCertificate;
SecIdentityCopyCertificate(myIdentity, &myCertificate);
NSData *certificateData = (__bridge NSData *) SecCertificateCopyData(myCertificate);

// Output certificate base64 value. (This value goes to <ds:X509Certificate> tag )
NSLog(@"%@", [certificateData base64EncodedString]);

// Helper function

OSStatus extractIdentityAndTrust(CFDataRef inP12data, SecIdentityRef *identity, SecTrustRef *trust)
{
    OSStatus securityError = errSecSuccess;

    CFStringRef password = CFSTR("password");
    const void *keys[] = { kSecImportExportPassphrase };
    const void *values[] = { password };

    CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);

    CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
    securityError = SecPKCS12Import(inP12data, options, &items);

    if (securityError == 0) {
        CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex(items, 0);
        const void *tempIdentity = NULL;
        tempIdentity = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemIdentity);
        *identity = (SecIdentityRef)tempIdentity;
        const void *tempTrust = NULL;
        tempTrust = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemTrust);
        *trust = (SecTrustRef)tempTrust;
    }

    if (options) {
        CFRelease(options);
    }

    return securityError;
}
person Almas Adilbek    schedule 30.07.2014
comment
Привет, можете ли вы опубликовать здесь все шаги по созданию цифровой подписи для xml? - person Christian; 16.01.2015
comment
@Christian Для этого я использовал частную библиотеку. Реализованы конкретные криптопровайдеры. Так что я думаю, это зависит от того, что вам именно нужно. Я видел много примеров, реализованных и опубликованных в SO и т. д. - person Almas Adilbek; 16.01.2015
comment
Скажите, какой библиотекой вы пользуетесь? - person Christian; 20.01.2015
comment
@Christian, это библиотека, созданная местным правительством, мы получили ее, отправив официальный запрос по электронной почте. Я думаю, что стандартные реализации также должны работать. - person Almas Adilbek; 20.01.2015