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");
        }
    }