iPhone Custom CA сертификат для приложения, которое использует NSURLConnection? - PullRequest
10 голосов
/ 12 июня 2010

У меня есть приложение, которое взаимодействует со многими различными сайтами, и каждый сайт имеет свой собственный сертификат SSL, подписанный нашим собственным внутренним центром сертификации.Это избавляет нас от необходимости покупать SSL-сертификаты для каждого сайта (сотни или тысячи) и является более безопасным, чем использование группового сертификата с общим ключом на каждом из этих сайтов.Таким образом, использование сертификата CA - единственный способ.

Сейчас у меня есть файл mobileprovision, который установит сертификат CA в качестве профиля на телефоне.Когда наше приложение iPhone запускается, если оно получает ошибку SSL-сертификата, оно перенаправляет в этот файл мобильного обеспечения через Safari, и пользователю будет предложено установить CA.

Проблема в том, что я обеспокоен тем, что Apple AppStore может запретить моему приложению делать это (просто некоторые отзывы от других разработчиков на данный момент), и я хотел исследовать другие способы сделать это.

По сути, мне нужно разрешить SSL-соединение, которое будет проверяться по сертификату CA, который будет встроен в мое приложение.Это сделает сертификат CA активным только для звонков, которые я делаю.Я использую стандартные методы NSURLConnection для связи со службой.

Возможно ли это?Может кто-нибудь показать мне, как загрузить CA (в какой форме PEM?) И добавить его в список доверенных сертификатов CA для моего приложения?Если это невозможно, какие еще варианты у меня есть?Просто доверять всем сертификатам на самом деле не вариант, мы хотим предотвратить атаки «посредников» и доверять только сертификатам, выпущенным CA.

Спасибо!

1 Ответ

1 голос
/ 29 сентября 2010

Используйте приведенный ниже метод двух делегатов 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");
        }
    }
...