Чтобы повысить безопасность моего приложения и защитить пользователя от MITM-атак, я пытаюсь закрепить SSL с помощью своего самозаверяющего сертификата, следуя содержанию этот пост.
Поэтому я использую следующий код для сравнения сертификата, который я получаю с сервера, с сертификатом, включенным в приложение.
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, 0);
NSData *remoteCertificateData = CFBridgingRelease(SecCertificateCopyData(certificate));
NSLog(@"Remote Certificate Data Length: %d",[remoteCertificateData length]);
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"apache" ofType:@"crt"];
NSData *localCertData = [NSData dataWithContentsOfFile:cerPath];
NSLog(@"Local Certificate Data Length: %d",[localCertData length]);
if ([remoteCertificateData isEqualToData:localCertData]) {
NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
Единственные вещи, которые отличаются между моим кодом и кодом в сообщении блога, на которое я ссылаюсь, — это имя и расширение (от .cer до .crt) для ресурса, представляющего мой сертификат, и два NSLogs, которые я добавил, которые пригодятся позже, чтобы показать в чем проблема.
Фактически, когда этот код выполняется, я получаю этот вывод:
2013-05-22 16:08:53.331 HTTPS Test[5379:c07] Remote Certificate Data Length: 880
2013-05-22 16:09:01.346 HTTPS Test[5379:c07] Local Certificate Data Length: 1249
Очевидно, что сравнение между локальным и удаленным сертификатами не удается, потому что длина данных отличается, и поэтому также не удается закрепить.
Почему это происходит и как я могу решить эту проблему?