iphone: есть ли безопасный способ установить двусторонний SSL из приложения

Мне нужно установить двухстороннее SSL-соединение HTTPS от моего приложения iPhone к серверу клиента. Однако я не вижу никакого безопасного способа доставки сертификатов на стороне клиента в приложение (это приложение для электронного банкинга, поэтому безопасность действительно является проблемой). Из того, что я нашел до сих пор, единственный способ, которым приложение могло бы получить доступ к сертификату, — это предоставить его предварительно в комплекте с самим приложением или предоставить URL-адрес, с которого его можно было бы получить (Приложение для iPhone с клиентскими сертификатами SSL).

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

Весь протокол безопасности должен выглядеть следующим образом:
 – HTTPS с двусторонним протоколом SSL для аутентификации приложения
 – Регистрация пользователя на основе OTP (токена) (на этом шаге создается пара ключей на стороне клиента)
 – SOAP/WSS XML-Signature (запросы, подписанные сгенерированными ранее ключами)

Любая идея о том, как установить первый уровень безопасности (HTTPS)?


person pmilosev    schedule 05.05.2010    source источник
comment
Вас просят выполнить двухфакторную аутентификацию или двусторонний SSL? Две разные вещи. Двусторонний SSL хорош в теории, но беспорядок в настройке хранилищ сертификатов с обеих сторон и обмене сертификатами.   -  person Keith Adler    schedule 05.05.2010
comment
Не забывайте, что если ваше приложение действительно полезно вашим клиентам, срок действия сертификатов в какой-то момент истечет. Так что не думайте, что первоначальная настройка — это конец этой проблемы. Возможно, вам придется добавить генерацию CSR в свое приложение и попросить своих ИТ-специалистов предоставить эти вещи (будет ли вручную проверять отпечаток на CSR и на исходном сертификате в пользовательском интерфейсе приложения, прежде чем выдавать ответ, достаточно хороший для ваших целей?).   -  person Jason    schedule 06.05.2010
comment
Я предполагаю, что это двусторонний SSL. Что мне нужно, так это установить HTTPS-соединение с сервером, подтвердив (через сертификат), что клиент действительно является моим приложением. Мы планируем иметь один сертификат для всех пользователей, поэтому нет необходимости в сертификате для каждого пользователя, так как это делается на более высоком уровне, чем http. На данный момент мы рассматриваем возможность объединения зашифрованного сертификата с приложением и наличия ключа дешифрования где-то в байт-коде. Это не безопасность верхнего уровня, но ее должно быть достаточно для этого уровня. Любая идея о том, как лучше защитить ключ дешифрования?   -  person pmilosev    schedule 06.05.2010
comment
Проблема со встраиванием первого ключа в ваше приложение заключается в том, что «легко» сломать вашу систему. Брюс Шнайер — хорошая отправная точка для более эффективных методов начальной безопасности.   -  person KevinDTimm    schedule 06.05.2010
comment
Я собираюсь сдуть пыль с этого вопроса. Как вы справились с этим решением?   -  person Mike    schedule 22.06.2016


Ответы (2)


Итак, чтобы ответить на мой собственный вопрос...

Выяснилось, что ценная бумага не имеет фиксированной шкалы измерения. Требования безопасности выполняются до тех пор, пока цена торможения системы значительно превышает приз, который можно получить за это.

В моей ситуации речь идет о системе электронного банкинга, но с несколько низкими месячными лимитами (пару тысяч долларов США). Как я уже упоминал в своем вопросе, над HTTPS будет еще один уровень безопасности, который будет включать XML-подписи WSS. Процесс регистрации пользователя и принятия его открытого ключа также выполняется в несколько этапов. На первом этапе пользователь отправляет свой номер телефона вместе с кодом, каким-то образом полученным от моего клиента. Затем пользователю отправляется SMS с кодом подтверждения. Пользователь вводит код подтверждения в калькулятор OTP, который выдает код OTP, который идентифицирует пользователя. Затем открытый ключ отправляется на сервер вместе с OTP-кодом. Отсюда каждый запрос будет подписан закрытым аналогом открытого ключа, отправленного на сервер ранее.

Таким образом, самым большим недостатком всего процесса является то, что кто-то реконструирует приложение и извлекает сертификат клиента, используемый для SLL. Единственная проблема, связанная с этим, заключается в том, что кто-то может наблюдать за транзакциями пользователей. Однако для того, чтобы кто-то совершил транзакцию, ему потребуется закрытый ключ пользователя, который генерируется, шифруется и сохраняется в цепочке ключей. И цена торможения этого уровня безопасности ОЧЕНЬ ВЫСОКАЯ.

Мы дополнительно подумаем, как защитить данные пользователей на более высоком уровне (например, с помощью WSS Encryption), но для начала я думаю, что с текущим решением нас все устраивает.

любое мнение?

С уважением

person pmilosev    schedule 07.05.2010

https на самом деле так не работает. Короче говоря, вы подключаетесь к защищенному серверу, где сертификаты подписаны известным авторитетом.

Если вы используете для этого классы Apple (iPhone), они будут принимать только «хорошие» сертификаты. Под хорошим я подразумеваю то, что Apple считает приемлемым. Если вы их не используете (в SDK есть альтернативы), вы не сможете подключиться (кроме, может быть, в случае, когда у вас есть лицензия разработчика «Enterprise» — но я не могу сказать, что с 100% уверенность, так как я недостаточно посмотрел на эту лицензию, чтобы быть уверенным)

Чтобы продолжить, используйте https-соединение с правильно подписанным веб-сайтом, а затем установите какой-либо логин со встроенным именем пользователя/паролем или запрос/ответ на основе уникального идентификатора iPhone (например) и обмен ключами с использованием этого соединения.

Обратите внимание, что это означает, что ваше приложение должно будет запрашивать новые сертификаты (каждое соединение/каждые X соединений/каждый месяц/интервалы, указанные приложением), чтобы поддерживать их в актуальном состоянии. Затем вы можете использовать эти сертификаты для подключения к более безопасному серверу.

[редактировать]

Проверьте эту публикацию — может быть дополнительная информация о том, что вы просите сделать

[/редактировать]

[править2]

Обратите внимание, что запрос относится к iphone, а не к OSX — утверждение в магазине приложений является проблемой.

[/edit2]

person KevinDTimm    schedule 05.05.2010
comment
Я думаю, что вам не хватает концепции из вашего набора инструментов: взаимная аутентификация. Это то, о чем спрашивает ОП. - person Jason; 06.05.2010
comment
@ Джейсон, он не верит, что аутентификация клиента возможна с помощью ssl, поэтому я поставил ему -1 - person rook; 06.05.2010
comment
Таким образом, не удается выполнить проверку подлинности клиента, а затем не удается выполнить проверку подлинности клиента с этой библиотекой. Я не могу говорить о библиотеке iPhone, так как я полный нуб, но есть библиотеки, которые моим товарищам по команде пришлось заменить, потому что они не могли заставить работать аутентификацию клиента или просто не хватало параметров конфигурации, чтобы сделать это не безмозглое. - person Jason; 06.05.2010
comment
При моем использовании библиотеки библиотека требует, чтобы сертификат был «хорошим». Яблоко «хорошо». Таким образом, сертификат, который вы подготовите, а затем поделитесь между клиентом и сервером, не будет разрешен. Единственный способ сделать это — использовать классы, специально запрещенные Apple — классы, которые не позволят вашему приложению получить одобрение. - person KevinDTimm; 06.05.2010
comment
@Rook - аутентификация клиента невозможна с iphone, по крайней мере, не так, как вы хотели бы, чтобы он это делал. - person KevinDTimm; 06.05.2010
comment
https на самом деле не работает таким образом. это неправильное название, и, вероятно, поэтому у вас есть -2. - person rook; 06.05.2010
comment
Попался. вы абсолютно правы, я просматривал это каждый раз, когда читал пост, и не видел провала. Спасибо. - person KevinDTimm; 06.05.2010
comment
Просто чтобы прекратить спор :D Мы еще не обсуждали это с моим клиентом, но я почти уверен, что CERT будет действительным, подписанным известным авторитетом. Меня интересовало только, как безопасно доставить этот сертификат в приложение. - person pmilosev; 06.05.2010
comment
Не ссора, я больше узнаю, что ошибаюсь, чем мне нравится быть правым ;) Тем не менее, если вы используете вызов / ответ, о котором я упоминаю в моем 4-м редактировании, я думаю, у вас все будет хорошо (также обратите внимание, что я бы посоветовал проверить для новых сертификатов каждый раз - вещи, основанные на времени, всегда терпят неудачу) - person KevinDTimm; 06.05.2010