Закрепление 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 не выдает такие сертификаты.

Другие вопросы по тегам