Можем ли мы получить серийный номер, DN эмитента, сведения о субъекте сертификата x509 в IOS SDK iphone - PullRequest
1 голос
/ 13 декабря 2011

Можем ли мы получить сведения о сертификате X509 (серийный номер, DN эмитента, сведения о субъекте) с помощью ios sdk или Openssl?

Ответы [ 2 ]

5 голосов
/ 31 мая 2012

К сожалению, в iOS платформа безопасности не дает вам такой же уровень доступа к серийным номерам, DN и altNames, как у OSX.

Однако вы можете получить доступ к сертификату DER в его сыром виде (SecIdentityCopyCertificate ()) и иметь несколько простых функций, таких как SecCertificateCopySubjectSummary (), для извлечения самых минимальных вещей.

Если вы хотите попасть в сериал. DN и (alt) предмет - тогда вам придется анализировать DER на сегодняшней iOS. Довольно простой способ - использовать для этого OpenSSL.

Я нашел http://atastypixel.com/blog/easy-inclusion-of-openssl-into-iphone-app-projects/ прост в установке / использовании.

Как только вы это сделаете, вы можете проверить МЭД:

CFDataRef der = SecCertificateCopyData(cert);
const unsigned char * ptr = CFDataGetBytePtr(der);
int len = CFDataGetLength(der);

d2i_X509(&x509,&ptr,len);    
_sha1 = [(__bridge NSData *)der sha1];

и тогда вы отправитесь на гонки с такими вещами, как:

X509_NAME * names_s = X509_get_subject_name(x509);
X509_NAME * names_i = X509_get_issuer_name(x509);
GENERAL_NAMES * subjects = X509_get_ext_d2i( x509, NID_subject_alt_name, 0, 0 );

ASN1_INTEGER *serial = X509_get_serialNumber(x509);
unsigned  long s = ASN1_INTEGER_get(serial);

с несколько болезненным переводом всего этого по мере необходимости:

+(NSArray *)names:(GENERAL_NAMES *)sANs {

int i, numAN = sk_GENERAL_NAME_num( sANs );
NSMutableArray * out = [NSMutableArray arrayWithCapacity:numAN];

for( i = 0; i < numAN; ++i ) {
    GENERAL_NAME *sAN = sk_GENERAL_NAME_value( sANs, i );

    if( sAN->type == GEN_DNS) {
        unsigned char *dns;
        int len = ASN1_STRING_to_UTF8( &dns, sAN->d.dNSName );
        if (len >0) {
            [out addObject:[[NSString alloc] initWithData:[NSData dataWithBytes:dns length:len] encoding:NSUTF8StringEncoding]];
            OPENSSL_free( dns );
        }
    }
    .. more types as needed ..
}
return out;
}

Спасибо

Dw.

1 голос
/ 31 мая 2012

Вы можете найти нужные сведения в NSURLProtectionSpace классе.

Убедитесь, что вы проверяете отличительные имена свойство в классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...