Это довольно большой вопрос =) ниже приведен обзор высокого уровня HTTPS; кричите, если что-то не ясно, и я заполню более подробную информацию.
при использовании соединения HTTPS шифрование с открытым ключом используется только во время инициализации сеанса. Частью этой инициализации является безопасная замена закрытого общего ключа, который затем используется для симметричного шифрования. Причина этого заключается в том, что асимметричное шифрование (Открытый ключ) значительно медленнее, чем симметричный ключ шифрование, благодаря математике.
SSL-подтверждения
на очень высоком уровне протокол выглядит примерно так:
клиент отправляет начальное сообщение "HELLO", которое содержит версию ssl, которую он хотел бы использовать, псевдослучайную строку битов (назовем ее B1) и список различных шифров, которые она поддерживает.
сервер отвечает своим собственным сообщением "HELLO", другой псевдослучайной строкой битов (давайте назовем это B2), шифр, который он выбрал (обычно самый сильный шифр из списка, который клиент отправил, который поддерживает сервер), и его сертификат, который содержит его открытый ключ (давайте назовем это k).
клиент затем использует сертификат для аутентификации сервера (см. ниже) и создает "premaster secret" - другую строку pseduo-случайных битов, которые мы будем называть S.
Если клиент доволен результатами аутентификации сервера, он шифрует премастер секрет S с открытым ключом сервера k, и отправляет его на сервер (сам по себе шифруется, но соединения все равно нет).
на данный момент сервер и клиент совместно используют три строки битов-B1, B2 и S. B1 и B2 были отправлены в открытом виде-S был зашифрован, и поэтому, предполагая, что закрытый ключ сервера действительно является частным, известен только клиенту и сервер.
и клиент, и сервер затем используют эти три битовые строки для построения ключа сеанса - строки, которая известна только им и может использоваться в качестве ключа в ранее выбранном симметричном шифре.
клиент и сервер обмениваются сообщениями, которые указывают на изменение протокола, и все последующие сообщения шифруются (симметрично, с ключом, вычисленным выше).
сервер проверка подлинности
когда клиент получает сообщение сервер здравствуйте, он должен быть уверен, что он говорит, он думает. Сертификат сервера и ключ используются для установления этого доверия.
весь цифровой сертификат является третьей стороной, утверждающей, что "эта сущность содержит закрытый ключ, который соответствует этому открытому ключу, который встроен в этот сертификат". Организации как VeriSign будет принять это утверждение на цену. Почему люди платят VeriSign и другие для сертификатов является то, что Verisign пошли на неприятности получения их промежуточных сертификатов, встроенных в большинстве распространенных браузеров.
Итак, когда клиент получит приветствие сервера, он выполнит следующие проверки:
- попадает ли сегодняшняя дата в период действия сертификата?
- совпадает ли имя субъекта сертификата с именем сервера, к которому я пытаюсь подключиться?
- имя эмитента сертификата совпадение с любым из ЦС, чьи открытые ключи мне известны?
- если да, то открытый ключ, который я имею для этого CA, проверяет этот сертификат?
Если все эти проверки проходят, клиент предполагает, что он может верить, что сервер, кого он ожидал. Затем он принимает открытый ключ (все еще k) из сертификата и использует его для безопасной передачи S на сервер. На данный момент идея заключается в том, что у вас есть утверждение третьей стороны (Verisign) что открытый ключ принадлежит серверу; поэтому только сервер сможет расшифровать результат E (S,k), и, следовательно, только сервер может создать соответствующий ключ, который вы будете использовать для симметричного шифрования.
после рукопожатия ваша уверенность в том, что пакеты не могут быть прочитаны третьей стороной, должна быть равна вашей уверенности в симметричном алгоритме, который используется.
(есть и другие приятные повороты-например, причина, по которой используются три битовые строки чтобы предотвратить атаки воспроизведения. Если используется только S, злоумышленник может записать весь сеанс и воспроизвести его в свободное время-например, повторяя инструкцию по переводу денег снова и снова. Имея как клиент, так и сервер генерировать дополнительные строки pseduo случайных, вы значительно уменьшить вероятность двух независимых SSL рукопожатий, производящих тот же S.)