Получить данные SSL сертификата - PullRequest
11 голосов
/ 24 октября 2011

Я хочу проверить сертификат SSL, который получает -(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge, и у меня есть следующий фрагмент, который дает мне общее имя эмитента и DER.

SecTrustRef trustRef = [[challenge protectionSpace] serverTrust];
SecTrustEvaluate(trustRef, NULL);
CFIndex count = SecTrustGetCertificateCount(trustRef); 

for (CFIndex i = 0; i < count; i++)
{
    SecCertificateRef certRef = SecTrustGetCertificateAtIndex(trustRef, i);
    CFStringRef certSummary = SecCertificateCopySubjectSummary(certRef);
    CFDataRef certData = SecCertificateCopyData(certRef);
}

Кроме того, я хотел бы получитьотпечаток пальца и подпись.Мои знания SSL не так уж глубоки;возможно я могу извлечь вышеупомянутое из представления DER?

Документация не помогает.http://developer.apple.com/library/ios/#documentation/Security/Reference/certifkeytrustservices/Reference/reference.html.

1 Ответ

13 голосов
/ 16 декабря 2011

Вы можете получить отпечаток sha1 следующим образом.

// #import <CommonCrypto/CommonDigest.h>
+(NSString*)sha1:(NSData*)certData {
    unsigned char sha1Buffer[CC_SHA1_DIGEST_LENGTH]; 
    CC_SHA1(certData.bytes, certData.length, sha1Buffer); 
    NSMutableString *fingerprint = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 3]; 
    for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; ++i) 
        [fingerprint appendFormat:@"%02x ",sha1Buffer[i]]; 
    return [fingerprint stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
}

Отпечаток md5 можно получить аналогичным образом.Полученные таким образом хэши sha1 и md5 соответствуют отпечаткам пальцев, отображаемым Safari и Chrome для ненадежного сертификата.

...