IPhone Custom CA сертификат для приложения, которое использует NSURLConnection?
У меня есть приложение, которое общается со многими разными сайтами, и каждый сайт имеет свой собственный сертификат SSL, подписанный нашим собственным внутренним центром сертификации. Это не позволяет нам приобретать SSL-сертификаты для каждого сайта (сотни или тысячи) и более безопасно, а затем использовать подстановочный сертификат с общим ключом на каждом из этих сайтов. Таким образом, в основном использование сертификата CA - единственный способ.
Сейчас у меня есть файл mobileprovision, который установит сертификат CA в качестве профиля на телефоне. Когда приложение iPhone запускается, если оно получает сообщение об ошибке SSL, оно перенаправляется в этот файл мобильного обеспечения через Safari, и пользователю будет предложено установить CA.
Проблема в том, что я обеспокоен тем, что Apple AppStore может отрицать мое приложение для этого (просто некоторые отзывы от других разработчиков на данном этапе), и я хотел исследовать другие способы достижения этого.
В основном, что мне нужно сделать, это разрешить SSL-соединение, которое будет проверяться против специального сертификата CA, который будет встроен в мое приложение. Это сделает сертификат ЦС активным только для вызовов, которые я делаю. Я использую стандартные методы NSURLConnection для связи с сервисом.
Возможно ли это? Может ли кто-нибудь показать мне, как загрузить CA (какая форма PEM?) И добавить его в список доверенных сертификатов CA для моего приложения? Если это невозможно, какие у меня есть другие варианты? Просто доверять всем сертификатам на самом деле не какой-либо вариант, мы хотим предотвратить попадание людей в средние атаки и доверять только нашим сертификатам CA.
Спасибо!
Ответы
Ответ 1
Используйте два метода делегата NSURLConnection для доступа к любому сайту с недопустимым сертификатом
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
NSLog(@"canAuthenticateAgainstProtectionSpace");
if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) {
// Note: this is presently only called once per server (or URL?) until
// you restart the app
NSLog(@"Authentication checking is doing");
return YES; // Self-signed cert will be accepted
// Note: it doesn't seem to matter what you return for a proper SSL cert
// only self-signed certs
}
return NO;
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog(@"didReceiveAuthenticationChallenge");
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
NSLog(@"chalenging protection space authentication checking");
}
}