Закрепление 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
Мое приложение будет знать, чтобы заблокировать запрос?
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 не выдает такие сертификаты.