Почему требуется закрепление SSL-сертификата?

Я не совсем понимаю необходимость закрепления сертификатов при установлении SSL-соединений с высокой степенью надежности (чтобы избежать атак Man in the Middle).

Для закрепления SSL-сертификата требуется встраивание исходного сертификата сервера в хост для проверки с сертификатом, представленным сервером. В чем разница между сертификатом сервера, встроенным в хост, и сертификатом, представленным сервером для проверки клиентом?

Что мне здесь не хватает?

2 ответа

Решение

В чем разница между сертификатом сервера, встроенным в хост, и сертификатом, представленным сервером для проверки клиентом?

Там не должно быть ни одного, и это точно точка закрепления сертификата.

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

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

Обратите внимание, что для понимания закрепления может потребоваться понять, как работает аутентификация сервера. Одна часть этого - то, что сертификат сервера проверен (имя хоста, срок действия, цепочка доверия...). Но этого недостаточно, поскольку сам сертификат является общедоступным, т. Е. Каждый может получить его и отправить в рамках рукопожатия TLS. Таким образом, другой важной частью аутентификации является то, что сервер доказывает, что он является владельцем сертификата. Это делается путем подписания некоторых данных с использованием закрытого ключа, соответствующего сертификату. Поскольку только владелец сертификата должен иметь закрытый ключ, это подтверждает право собственности. Из-за этого любой может встроить сертификат сервера для закрепления, но только сам сервер может подтвердить право собственности на сертификат.

Что такое закрепление SSL

Приложения настроены так, чтобы доверять нескольким выбранным сертификатам или центрам сертификации (ЦС), вместо поведения по умолчанию: доверять всем ЦС, которые предварительно настроены на устройстве/машине. Закрепление SSL не требуется.

Зачем использовать SSL-пиннинг (почему бы и нет)

Во многих случаях сертификат, возвращаемый сервером, может быть подделан, если какой-либо корневой (или промежуточный) ЦС был скомпрометирован (случается очень редко). Злоумышленники могут использовать этот скомпрометированный ЦС для создания сертификата для вашего веб-сайта и вместо этого показывать посетителям свой веб-сайт. Это плохо. Закрепление SSL было разработано, чтобы предотвратить это в некоторых случаях, но есть лучшие способы (ИМХО).

Сказав это, я не знаю ни одного веб- сайта , который использует закрепление SSL, поэтому закрепление SSL, похоже, в первую очередь обсуждается для мобильных приложений. Кажется, что закрепление SSL работает только тогда, когда вы можете доверять источнику приложения (например, App Store, Play Store). Почему? Потому что, если вам нужно посетить веб-сайт, чтобы получить сертификат, к тому времени будет слишком поздно (возможно, вы уже использовали сомнительный сертификат и получили доступ к поддельному веб-сайту или прошли MITM). Таким образом, кажется, что преимущества, упомянутые Стеффеном, не так убедительны, особенно когда уже есть лучшие решения:

Лучшее решение

Я не уверен, является ли взлом ЦС вектором угрозы, даже для банков. Вместо этого банки и другие организации, заботящиеся о безопасности, будут разумно выбирать ЦС, а также настраивать запись ЦСА .

  • Используя DNS-запись CAA, они могут запретить клиентам (например, браузерам, мобильным приложениям) доверять только определенным сертификатам при доступе к их конкретному веб-сайту.
  • Они выбирают ЦС и создают сертификат только из этого ЦС.
  • У них будет запасной план на случай компрометации ЦС. Не хочу вдаваться в подробности здесь, но план резервного копирования для записей CAA, ИМХО, намного лучше, чем план закрепления SSL.

Например, Monzo.com (я использовал whatsmydns , чтобы найти это) имеет запись CAA, которая ограничивает сертификаты только 4 центрами сертификации (digicert, amazon, comodoca, buypass):

      0 iodef "mailto:security@monzo.com"
0 issue "amazon.com"
0 issue "buypass.com"
0 issue "comodoca.com"
0 issue "digicert.com"
0 issue "letsencrypt.org"
0 issuewild "amazon.com"
0 issuewild "comodoca.com"
0 issuewild "digicert.com"
0 issuewild "letsencrypt.org"

Это популярные центры сертификации, которым люди доверяют, надеемся , они нас не подведут. Если они это сделают, весь Интернет станет бесплатным для всех. Единственный способ предотвратить это — быть собственным центром сертификации/использовать самозаверяющие сертификаты.

Резюме

Я не вижу, как закрепление SSL станет повсеместным, особенно с учетом того, что оно добавляет больше накладных расходов (обслуживание в отношении истечения срока действия ssl или в любом случае доверие одному CA - SPoF, или эмуляция того, что делает запись CAA, но с дополнительным кодом / бременем обслуживания). Он также поддерживает только ваши предустановленные приложения, а не веб-сайты.

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