Какая последовательность действий необходима для безопасной проверки сертификата ssl? Мое (очень ограниченное) понимание заключается в том, что когда вы посещаете сайт https, сервер отправляет сертификат клиенту (браузеру), а браузер получает информацию об издателе сертификата из этого сертификата, а затем использует ее для связи с издателем и каким-то образом сравнивает сертификаты на срок действия.
нашел это видео очень полезным для понимания потока youtube.com/watch?v=T4Df5_cojAs





У клиента есть предварительно заполненное хранилище открытых ключей центров сертификации SSL. Чтобы серверу можно было доверять, должна существовать цепочка доверия от сертификата для сервера через промежуточные органы до одного из так называемых «корневых» сертификатов.
Вы можете просмотреть и / или изменить список доверенных центров. Часто вы делаете это, чтобы добавить сертификат местного органа власти, которому, как вы знаете, доверяете, например, компании, в которой вы работаете, или школы, которую вы посещаете, или чего-то еще.
Предварительно заполненный список может варьироваться в зависимости от того, какой клиент вы используете. Крупные поставщики сертификатов SSL гарантируют, что их корневые сертификаты есть во всех основных браузерах ($$$).
Атаки «обезьяна в середине» «невозможны», если у злоумышленника нет закрытого ключа доверенного корневого сертификата. Поскольку соответствующие сертификаты широко используются, раскрытие такого закрытого ключа может иметь серьезные последствия для безопасности электронной коммерции в целом. Из-за этого эти закрытые ключи очень и очень тщательно охраняются.
Вот очень упрощенное объяснение:
Ваш веб-браузер загружает сертификат веб-сервера, который содержит открытый ключ веб-сервера. Этот сертификат подписан закрытым ключом доверенного центра сертификации.
В вашем браузере установлены открытые ключи всех основных центров сертификации. Он использует этот открытый ключ для проверки того, что сертификат веб-сервера действительно подписан доверенным центром сертификации.
Сертификат содержит доменное имя и / или IP-адрес веб-сервера. Ваш веб-браузер подтверждает в центре сертификации, что адрес, указанный в сертификате, является тем адресом, к которому он имеет открытое соединение.
Ваш веб-браузер генерирует общий симметричный ключ, который будет использоваться для шифрования HTTP-трафика в этом соединении; это намного эффективнее, чем использование шифрования с открытым / закрытым ключом для всего. Ваш браузер шифрует симметричный ключ с помощью открытого ключа веб-сервера, а затем отправляет его обратно, таким образом гарантируя, что только веб-сервер может его расшифровать, поскольку только веб-сервер имеет свой закрытый ключ.
Обратите внимание, что центр сертификации (ЦС) необходим для предотвращения атак типа «злоумышленник в середине». Однако даже неподписанный сертификат не позволит кому-либо пассивно прослушивать ваш зашифрованный трафик, поскольку у них нет возможности получить доступ к вашему общему симметричному ключу.
Примерно на шаге 1.5 сервер также что-то «подписывает» закрытым ключом, связанным с его сертификатом. Это в сочетании с проверкой имени / IP-адреса гарантирует, что его представляет только сайт-владелец сертификата.
Чтобы увидеть полный рабочий пример этого процесса с использованием Firefox, подключенного к amazon.com, см. moserware.com/2009/06/first-few-milliseconds-of-https.html
«В вашем браузере установлены открытые ключи всех основных центров сертификации». Кто решает, что считать «главным центром сертификации»? Если открытый ключ центра сертификации, который я использую, не предустановлен в моем браузере, разве мой браузер не сможет получить открытый ключ, не открывая себя для атаки типа «злоумышленник в середине»?
@ Ajedi32: Каждый браузер решает отдельно; в целом существует широкое согласие относительно основных действующих регистраторов, но иногда у вас есть регистраторы, которые исключаются из Firefox, но не из IE и т. д. И в этом случае вы правы, что загрузка их открытых ключей может открыть вас для атаки MITM, хотя на практике маловероятно (если вы живете в США), что с вами такое случится.
Я не знал, что в моем браузере установлены открытые ключи всех основных центров сертификации. Теперь я знаю, как мои SSL-сертификаты проверяются без риска MITM :). Спасибо!
Ссылка на интернет-архив с работающей версией moserware, которую Джефф опубликовал, на всякий случай: web.archive.org/web/20180123095118/http://www.moserware.com/…
серверу необходимо запросить сертификат у CAuthority, поэтому он отправляет ему запрос. Как CA может убедиться, что сервер действителен?
@voipp: Отличный вопрос! Исторически существовало несколько подходов, таких как «отправить электронное письмо с webmaster@<domain-being-verified> или« разместить этот файл в своем домене, чтобы доказать, что он принадлежит вам ». Однако действительно были проблемы с тем, что люди заставляли ЦС выдавать сертификаты для доменов, которые они не используют. t own - как известно, кому-то удалось заставить теневой ЦС выдать им сертификат для gmail.com!
В этом ответе отсутствует шаг, на котором сертификат или, скорее, все сертификаты в цепочке доверия должны быть проверены по списку отзыва сертификатов выдающего ЦС. Это достигается с помощью CRL или OCSP. Также этап, на котором браузер генерирует симметричный ключ, не является частью (серверного) сертификата, - это проверка. Это часть установления сеанса TLS.
Как ни странно, я не думаю, что это ответ на вопрос ... То, что вы написали в №2, в основном то, о чем он спрашивает. Другими словами: как наличие открытого ключа ЦС в сертификате, предоставляемом сервером, помогает проверить сертификат? Не мог ли какой-либо сертификат (даже злонамеренный) включать открытый ключ ЦС?
как насчет сроков годности?
@EliCourtwright `" Он использует этот открытый ключ для проверки того, что сертификат веб-сервера действительно подписан доверенным центром сертификации. "` Но как это проверить? что он делает с сообщением с известным открытым ключом, который указывает на его настоящий?
Вы полностью пропустили сообщение CertificateVerify, а клиент не шифрует общий симметричный ключ открытым ключом сервера и не передает его. Ключ согласовывается независимо на обоих концах.
@MarquisofLorne, можете ли вы дать ссылки на это утверждение?
На шаге 2 вы можете посоветовать, как браузер использует этот открытый ключ для проверки того, что сертификат веб-сервера действительно подписан доверенным центром сертификации. Делается ли это с помощью открытого ключа CA для расшифровки подписи сертификата и сравнения ее с содержимым сертификата?
Стоит отметить, что помимо покупки сертификата (как было сказано выше), вы также можете бесплатно создать свой собственный; это называется «самоподписанный сертификат». Разница между самозаверяющим сертификатом и купленным сертификатом проста: купленный сертификат был подписан центром сертификации, о котором ваш браузер уже знает. Другими словами, ваш браузер может легко проверить подлинность приобретенного сертификата.
К сожалению, это привело к распространенному заблуждению о том, что самозаверяющие сертификаты по своей сути менее безопасны, чем сертификаты, продаваемые коммерческими центрами сертификации, такими как GoDaddy и Verisign, и что вы должны жить с предупреждениями / исключениями браузера, если вы их используете; это неверно.
Если вы безопасно распространяете самозаверяющий сертификат (или сертификат CA, как предлагал bobince) и устанавливаете его в браузерах, которые будут использовать ваш сайт, он так же безопасен, как купленный, и не уязвим для атак типа «злоумышленник в середине» и подделки сертификатов. Очевидно, это означает, что это возможно только в том случае, если только нескольким людям нужен безопасный доступ к вашему сайту (например, внутренние приложения, личные блоги и т. д.).
Действительно, безопасное распространение собственного сертификата - это один из способов избавиться от шкуры кошки, но гораздо более простой - обратиться в любой из ряда так называемых «открытых» центров сертификации. CACert.org - мой любимый. Пока вы доверяете действиям, которые они предпринимают для защиты выпуска своих сертификатов, импорт их корневых сертификатов безопасен.
Мне нравится этот комментарий - к сожалению, он подчеркивает очень важную слабость центров сертификации. Допустим, вы импортируете сертификат CA от Боба Смита - ну, Боб Смит может подписать сертификат для любого домена (включая google.com и chase.com). На самом деле, именно поэтому GoDaddy / Verisign платит большие деньги за включение в ОС - они проверяются службой безопасности, чтобы убедиться, что у них есть проверки, чтобы убедиться, что они не подписывают сертификат для злоумышленника. Я думаю, вы должны иметь возможность сказать «этот CA может подписывать сертификаты только для mysite.com».
Разве самоподписанный сертификат не более безопасен, поскольку центрам сертификации можно было бы заплатить за то, чтобы они подписали то, чего им не следовало иметь. Если вы можете безопасно распространять сертификаты CA на конечные точки, всегда используйте самозаверяющие сертификаты.
Существуют ли бесплатные и проверенные сертификаты CA в большинстве основных браузеров? Я ищу базовый сертификат только для подтверждения того, что у меня есть адрес электронной почты и доменное имя. Однако те, которые я нашел, не используются в большинстве основных браузеров.
@NathanAdams В теория большие центры сертификации должны проверять запросы, чтобы не выдавать поддельные сертификаты, как вы описываете ... но прочтите эту историю: stripe.ian.sh
Этот ответ является примером того, почему ответы должны быть самодостаточными и не зависеть от того, что находится в конце ссылки. Домен "clintharris.net" не найден.
Вы сказали, что
the browser gets the certificate's issuer information from that certificate, then uses that to contact the issuerer, and somehow compares certificates for validity.
Клиенту не нужно уточнять у эмитента, потому что две вещи:
Обратите внимание, что 2. невозможно обойтись без 1.
Это лучше объясняется в большая диаграмма, который я сделал некоторое время назад.
(перейдите к "что за подпись?" внизу)

Это должен был быть принятый ответ. Ответ @Eli Courtwright - это краткий imho, чтобы понять, как работают сертификаты.
Одного чтения этого может быть недостаточно, но если вы уже знакомы с частями SSL, это действительно объединит все воедино. Хорошая работа!
Фантастический образ. Наконец то, что объясняет мои вопросы. Куда бы я ни пошел, я просто сказал, что «браузер проверяет правильность сертификата». НО КАК ЭТО ЭТО ДЕЛАТЬ ?. Это дает ответ.
Великолепный ответ, спасибо огромное !!!! меня даже не волнует, упускает ли он некоторые детали, насколько мне известно, он полностью охватывает все важные шаги.
если вы более технически подкованы, возможно, вам нужен этот сайт: http://www.zytrax.com/tech/survival/ssl.html
предупреждение: кроличья нора уходит глубоко :).
Во-первых, любой может создать 2 ключа. Один для шифрования данных, а другой для дешифрования данных. Первый может быть закрытым ключом, а второй - открытым ключом AND VICERZA.
Во-вторых, проще говоря, центр сертификации (CA) предлагает услугу создания сертификата для вас. Как? Они используют определенные значения (имя эмитента ЦС, открытый ключ вашего сервера, название компании, домен и т. д.), А также свой закрытый ключ SUPER DUPER ULTRA SECURE SECRET и шифруют эти данные. Результатом этих зашифрованных данных является ПОДПИСЬ.
Итак, теперь центр сертификации возвращает вам сертификат. Сертификат - это в основном файл, содержащий ранее упомянутые значения (имя эмитента CA, название компании, домен, открытый ключ вашего сервера и т. д.), ВКЛЮЧАЯ подпись (т. Е. Зашифрованную версию последних значений).
Теперь, учитывая все вышесказанное, запомните часть ДЕЙСТВИТЕЛЬНО ВАЖНО: ваше устройство / ОС (Windows, Android и т. д.) В значительной степени хранит список всех основных / доверенных центров сертификации и их ОБЩЕСТВЕННЫЕ КЛЮЧИ (если вы думаете, что эти открытые ключи используются для расшифровки подписей внутри сертификатов, ТЫ ПРАВ!).
Хорошо, если вы прочитаете вышеизложенное, этот последовательный пример теперь будет проще простого:
Почему? Подумайте об этом, только этот открытый ключ может расшифровать подпись таким образом, чтобы содержимое выглядело так, как оно было до того, как закрытый ключ зашифровал их.
Это одна из основных причин (если не основная причина) создания вышеуказанного стандарта.
Допустим, хакер-Джейн перехватывает запрос интернет-пользователя-Боба и отвечает своим сертификатом. Тем не менее, hacker-Jane по-прежнему достаточно осторожен, чтобы указать в сертификате, что эмитент был Example-CA. Наконец, хакер-Джейн вспоминает, что она должна поставить подпись на сертификате. Но какой ключ использует Джейн для подписи (т.е. создания зашифрованного значения основного содержимого сертификата) сертификата ?????
Так что даже если хакер-Джейн подписала сертификат своим собственным ключом, вы увидите, что будет дальше. Браузер скажет: «Хорошо, этот сертификат выпущен Example-CA, давайте расшифруем подпись открытым ключом Example-CA». После расшифровки браузер замечает, что содержимое сертификата вообще не совпадает. Следовательно, браузер дает пользователю очень четкое предупреждение и говорит, что не доверяет соединению.
хорошее резюме. У меня еще есть один вопрос. «Наконец, хакер-Джейн помнит, что она должна включить подпись в сертификат.» => Подпись также недоступна для всех в сертификате, отправленном сервером?
@SRIDHARAN Мне нравится, как думает ваш хакер: -) Вы можете скопировать / вставить подпись из исходного сертификата. Однако Джейн необходимо расшифровать веб-трафик. Единственный способ - Джейн помещает в сертификат свой открытый ключ. Затем браузер использует этот ключ для шифрования запросов. Джейн использует свой закрытый ключ для расшифровки трафика. Что произойдет, если Джейн скопирует / вставит подпись: 1. Браузер Боба использует открытый ключ Example-CA для расшифровки подписи 2. Браузер сравнивает расшифрованное содержимое подписи с содержимым сертификата. 3. Браузер замечает, что открытые ключи не совпадают. 4. Браузер сообщает Бобу, что соединение небезопасно.
Спасибо, что ответили. Я просматривал эти темы. Теперь у меня есть хорошее понимание. Я тоже запутался в этом с подменой DNS. На что я нашел здесь идеальный ответ. security.stackexchange.com/a/94335.
Когда я узнал о HTTPS, меня учили, что закрытый ключ сервера используется для дешифрования, а открытый ключ используется для шифрования. Используется ли обратная терминология для проверки сертификата? Открытый ключ относится к ключу, используемому для дешифрования, а закрытый ключ CA используется для шифрования. Правильный?
привет @ Guy4444, приведенные выше шаги (1-5) частично объясняют начальное установление связи клиент / сервер (успешное рукопожатие = клиент доверяет серверу). С этого момента есть дополнительные шаги. Затем клиент генерирует пару открытого / закрытого ключей и отправляет открытый ключ на сервер. Теперь, когда сервер отправляет «материал» клиенту, он шифрует с помощью открытого ключа клиента, а клиент дешифрует с помощью своего закрытого ключа, и наоборот. Это называется асимметричным шифрованием. См. youtube.com/watch?v=T4Df5_cojAs