Получить данные сертификата SSL
Я хочу проверить сертификат 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
Вы можете получить отпечаток 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 для ненадежного сертификата.