Закрепление SSL-сертификата в iOS с помощью Microsoft Azure SDK

Это не вопрос о закреплении сертификата в целом.

Я пишу приложение для iOS, которое использует Microsoft Azure SDK для iOS. Они не реализовали закрепление сертификата, поэтому я загрузил полный SDK и модифицирую его, чтобы добавить свое собственное закрепление.

Я следую примеру кода, предоставленному OWASP. Он просит меня выполнить следующий код в терминале:

$ echo "Get HTTP/1.0" | openssl s_client -showcerts -connect www.random.org:443

Я запустил это, поменяв {url}.azurewebsites.net на www.random.org. Я получаю хороший результат с несколькими перечисленными сертификатами.

Основываясь на коде OWASP, кажется, что я должен использовать этот:

Certificate chain
 0 s:/CN=*.azurewebsites.net
   i:/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT SSL SHA2

Что меня беспокоит, так это то, что CN означает подстановочный знак *.azurewebsites.net. Означает ли это, что если я использую этот сертификат, а кто-то предпримет попытку атаки «злоумышленник посередине» с использованием другого веб-приложения Azure, закрепление этого сертификата будет успешным для них, что не позволит защитить мое приложение?

Например, если мое приложение находится в abc.azurewebsites.net, а атака «человек посередине» запущена из xyz.azurewebsites.net, будет ли мое приложение знать, что нужно заблокировать запрос?


person mbm29414    schedule 01.08.2017    source источник


Ответы (1)


Злоумышленник, зарегистрировавший xyz.azurewebsites.net в Azure, не может провести MitM-атаку с использованием xyz.azurewebsites.net, так как не знает закрытый ключ. Только Azure знает значение закрытого ключа.

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

Во-первых, давайте поговорим о закреплении открытого ключа сертификата, которым вы не владеете.

В таком случае будьте очень осторожны с тем фактом, что если бы вам приходилось управлять своим сертификатом сервера, вы могли бы повторно использовать один и тот же ключ каждый раз, когда вам приходилось запрашивать у ЦС выдачу нового сертификата для вас. Таким образом, вы можете избежать реализации того, что OWASP называет непрерывностью ключей (см. https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning). НО в вашем случае Microsoft разрешено использовать новый ключ при выпуске нового сертификата. В этом случае ваше приложение перестанет работать, а это не то, что вам нужно. Таким образом, вы должны реализовать непрерывность ключей при закреплении.

Итак, если вы хотели просто реализовать статически закрепленный ключ в своем приложении, я думаю, что это опасно. Microsoft может изменить открытый ключ, когда захочет. Например, если их закрытый ключ украден, они создадут новый сертификат с новым открытым ключом (и отзовут предыдущий сертификат). В таком случае ваше приложение увидит новый ключ, но не должно останавливать запрос.

Теперь давайте поговорим о закреплении открытого ключа с непрерывностью ключа подстановочного сертификата.

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

2- Теперь предположим, что кому-то удалось выпустить настоящий сертификат для xyz.azurewebsites.net. Таким образом, ваше приложение увидит, что сертификат не является ни abc.azurewebsites.net, ни *.azurewebsites.net. Таким образом, ваше приложение остановит запрос.

3- Наконец, предположим, что кому-то удалось выпустить настоящий сертификат для abc.azurewebsites.net. Ваше приложение увидит правильный сертификат для abc.azurewebsites.net. Итак, вам нужно закодировать ошибку в своем приложении, чтобы оно остановило запрос, потому что вы знаете, что Azure не выдает такие сертификаты.

person Alexandre Fenyo    schedule 01.08.2017
comment
Итак, если я правильно проверю открытый ключ Microsoft с помощью метода, описанного OWASP, могу ли я считать свое приложение защищенным от атак MitM? - person mbm29414; 01.08.2017
comment
Я обновил свой ответ, я не знаю, прочитали ли вы новую версию, прежде чем писать свой комментарий. В любом случае, я думаю, вам следует рассмотреть третий случай в моем ответе: если ваше приложение увидит сертификат для abc.azurewebsites.net, ваше приложение не будет смотреть на закрепленный ключ, потому что закрепленные ключи могут быть связаны только с ранее просмотренным сертификатом. Таким образом, если вы реализуете только то, что объясняет OWASP, вы не будете защищены от кого-то, кто может выдать настоящий сертификат для abc.azurewebsites.net. Чтобы защититься от такого злоумышленника, вы должны остановить запрос, если увидите такой сертификат. - person Alexandre Fenyo; 01.08.2017
comment
Я прочитал ваш ответ (несколько раз во время редактирования, лол). Что касается № 3, если кто-то действительно получит сертификат для этого домена (чего они не должны, верно, поскольку он принадлежит Microsoft?), не будет ли проверка учетных данных по-прежнему неудачной, поскольку данные сертификата не будут соответствовать данным закрепленного сертификата? ? - person mbm29414; 01.08.2017
comment
Microsoft владеет доменом, но если кто-то взломает центр сертификации, не тот, который использует Microsoft, а любой другой, он может выдать сертификат для этого домена. Таким образом, не взламывая Microsoft, можно было бы выпустить сертификат для этого домена. См. slate.com/articles/technology/future_tense/2016/12. / например. - person Alexandre Fenyo; 01.08.2017
comment
Итак, теперь я проверяю как сертификат сервера, так и мой локально закрепленный сертификат, а также проверяю, что URL-адрес сертификата сервера равен *.azurewebsites.net. Это покрывает все мои базы? Но я все еще не вижу, как кто-то выдает другой (действительный) сертификат, является проблемой. Он не пройдет сравнение сертификатов, если мой исходный (закрепленный) сертификат действительно от Microsoft, верно? Или я что-то упускаю? - person mbm29414; 01.08.2017
comment
Будьте очень осторожны с тем фактом, что если бы вам приходилось управлять своим сертификатом сервера, вы могли бы повторно использовать один и тот же ключ каждый раз, когда вам приходилось просить ЦС выдать для вас новый сертификат. Таким образом, вы можете избежать реализации того, что OWASP называет непрерывностью ключей (см. ). НО в вашем случае Microsoft разрешено выпускать новый сертификат с новым ключом. В этом случае ваше приложение перестанет работать, а это не то, что вам нужно. Итак, вы должны реализовать ключевую преемственность. - person Alexandre Fenyo; 01.08.2017
comment
Итак, если вы хотели просто реализовать статически закрепленный ключ в своем приложении, я думаю, что это опасно. Microsoft может изменить открытый ключ, когда захочет. Например, если их закрытый ключ украден, они создадут новый сертификат с новым открытым ключом (и отзовут предыдущий сертификат). В таком случае ваше приложение увидит новый ключ, но не должно останавливать запрос. - person Alexandre Fenyo; 01.08.2017
comment
Я обновил свой ответ, чтобы учесть обсуждение в комментариях. - person Alexandre Fenyo; 02.08.2017