我们可以在IOS SDK iphone中检索序列号,发卡者DN,x509证书的主题详细信息

che*_*tan 1 iphone xcode openssl ios

我们可以使用ios sdk或Openssl检索X509证书详细信息(序列号,发卡者DN,主题详细信息)吗?

Dir*_*lik 5

不幸的是,在iOS上,安全框架并没有为您提供与OSX上的序列号,DN和altNames完全相同的访问级别.

但是,您可以以原始格式(SecIdentityCopyCertificate())访问DER证书,并使用SecCertificateCopySubjectSummary()等一些粗略的函数来提取最小的东西.

如果你想获得序列号.DN和(alt)主题 - 然后你必须在今天的iOS上解析DER.一个相当简单的方法是使用OpenSSL.

我发现http://atastypixel.com/blog/easy-inclusion-of-openssl-into-iphone-app-projects/易于安装/使用.

一旦你有了这个,你可以检查DER:

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

d2i_X509(&x509,&ptr,len);    
_sha1 = [(__bridge NSData *)der sha1];
Run Code Online (Sandbox Code Playgroud)

然后你会参加比赛,比如:

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);
Run Code Online (Sandbox Code Playgroud)

根据需要翻译所有内容有点痛苦:

+(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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢,

DW.