2009-02-26 2 views
18

Говорить при использовании https браузер делает запрос на сервер, а сервер возвращает свой сертификат, включая открытый ключ и подпись ЦС.Вопрос SSL: как ROOT CA проверяет подпись

В этот момент браузер попросит свой ЦС проверить, действительно ли данный открытый ключ принадлежит серверу или нет?

Как эта проверка выполняется корневым сертификатом в браузере?

Чтобы привести пример: Скажем serverX получил сертификат от CA "rootCA". Браузер имеет копию локального хранилища rootCA. Когда браузер ping serverX и он отвечает своим открытым ключом + сигнатурой. Теперь корневой ЦС будет использовать свой закрытый ключ для дешифрования подписи и убедиться, что он действительно serverX?

Как это работает?

ответ

48

У вашего сервера есть сертификат, состоящий из частного и открытого ключа. Конечно, сервер никогда не выдаёт закрытый ключ, но каждый может получить открытый ключ. Открытый ключ встроен в формат контейнера сертификата. Этот формат содержит IP-адрес или доменное имя сервера, владельца этого IP-адреса/доменного имени, адрес электронной почты владельца и т. Д.

Все это подписывается доверенным органом. У доверенного органа, также известного как центр сертификации (CA), также есть пара частного/открытого ключа. Вы даете им свой сертификат, они проверяют правильность информации в контейнере и подписывают ее своим личным ключом, к которому они имеют доступ.

Открытый ключ ЦС по умолчанию установлен в пользовательской системе, наиболее известные ЦС включены уже в стандартную установку вашей любимой ОС или браузера.

Когда пользователь подключается к вашему серверу, ваш сервер использует закрытый ключ для подписи некоторых данных, пакетов, которые подписали данные вместе с открытым ключом и отправляет все клиенту.

Что теперь может сделать клиент? Прежде всего, он может использовать открытый ключ, который только что был отправлен для проверки подписанных данных. Поскольку только владелец частного ключа способен правильно подписать данные таким образом, чтобы открытый ключ мог проверить подпись, он знает, что тот, кто подписывает эту часть данных, этот человек владеет закрытым ключом к принятому открытому ключу , Пока все хорошо. Но что мешает хакеру перехватить пакет, заменить подписанные данные на данные, подписанные им другим сертификатом, а также заменить открытый ключ его открытым ключом? Ничего.

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

Последнее, но не менее важное: оно проверяет информацию в контейнере открытого ключа. Действительно ли IP-адрес или доменное имя соответствует IP-адресу или доменному имени сервера, с которым в данный момент разговаривает клиент? Если нет, то что-то подозрительное!

Люди могут спросить: что мешает хакеру просто создавать свою собственную пару ключей и просто помещать ваше доменное имя или IP-адрес в сертификат? Легко: если он это сделает, ни один СА не подпишет свой ключ. Чтобы получить подпись ЦС, вы должны доказать, что вы действительно являетесь владельцем этого IP-адреса или имени домена. Хакер - нет, он не может этого доказать, он не получит подпись. Так что это не сработает.

Хорошо, как насчет того, чтобы хакер регистрировал свой домен, создавал для этого сертификат и подписывал его ЦС? Это работает, он получит его CA подписан, это его домен, не проблема. Однако он не может использовать это при взломе вашего соединения. Если он использует этот сертификат, браузер сразу увидит, что подписанный открытый ключ предназначен для домена example.net, но в настоящее время он разговаривает с example.com, а не с одним и тем же доменом, поэтому что-то снова подозрительно.

+2

Хороший ответ! Но у меня есть другой связанный с этим вопрос ... Цитата: «Самые известные ЦС включены уже в установку по умолчанию вашей любимой ОС или браузера». Мне интересно, как браузер расширяет стандарт CA по умолчанию? Будет ли он автоматически проверяться на веб-службу? или он будет делать это только для следующей версии браузера? – forestclown

+2

Сертификаты CA либо отправляются вместе с браузером, либо операционной системой. В Firefox, Chrome, Opera есть собственные копии сертификатов CA, Internet Explorer и Safari используют сертификаты CA, установленные в Windows или OS X. Ничто не останавливает использование браузером как собственных копий, так и сертификатов ОС (некоторые из них, о которых я упоминал, могут даже делать что). Вы получаете только новые сертификаты CA, обновляя браузер, обновляя ОС или вручную устанавливая их (загрузка, а затем добавление их в браузер или вашу ОС, возможно). – Mecki

+3

Единственное, что браузеры проверяют онлайн (если они могут), является ли сертификат CA еще действительным или нет. Каждая служба CA запускает сервер отзыва сертификатов, где браузер может спросить, действительно ли какой-либо сертификат действителен или был отменен; это делается по протоколу OCSP: http://tinyurl.com/pcjk2. Сертификаты содержат адрес сервера OCSP. – Mecki

0

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

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

CACert.org имеет эту же проблему, имеет действующие сертификаты, но поскольку браузеры не имеют своих корневых сертификатов в своем списке, их сертификаты генерируют предупреждения до тех пор, пока пользователи не загрузят корневые ЦС и не добавят их в свой браузер.

+0

Мне непонятно. Скажем, serverX получил сертификат от CA rootCA. В браузере хранится сертификат rootCA. Поэтому, когда браузер ping serverX отвечает на него с помощью открытого ключа + подписи. Корневой ЦС будет использовать свой закрытый ключ для дешифрования подписи и убедиться, что он действительно serverX? – Sesh

+0

Нет, что он проверяет подписи, я могу подписывать что-то своим личным ключом, который проверяет мой открытый ключ. Таким образом, корневой ЦС, который локально хранится, фактически является публичной частью ЦС. Поэтому, если удаленный сервер отправляет сертификат, он будет иметь определенную подпись, тогда эта подпись может быть –

+0

математически рассчитана против публичной части ЦС, чтобы убедиться, что частная часть ЦС фактически подписала сертификат сама по себе. –

2

Сертификаты основаны на использовании асимметричного шифрования, такого как RSA. У вас есть два ключа, обычно называемые частными и открытыми ключами. Что-то вы encrypt с закрытым ключом можно дешифровать только с помощью открытого ключа. (И, фактически, наоборот.)

Вы можете думать о сертификате как о паспортной или водительской лицензии: это удостоверение, в котором говорится: «Это я есть, вы можете доверять ему, потому что это было дано мне кем-то (например, Verisign) вы доверяете ». Это делается с помощью «подписи», которая может быть рассчитана с использованием открытого ключа центра сертификации. Если данные - это то, что первоначально получил ЦС, вы можете проверить сертификат.

Сертификат содержит идентификационную информацию о владельце сертификата. Когда вы его получите, вы используете комбинацию ключа, который вы знаете из доверенного органа, чтобы подтвердить, что полученный вами сертификат является действительным, и что вы можете поэтому сделать вывод, что доверяете лицу, выдавшему сертификат.

+0

Подпись сервера должна быть довольно легко получить: просто отправьте на него https-запрос. Что делать, если серверY получает подпись serverX таким образом - не может ли он выдавать себя за серверXX? – Sesh

+0

Нет, когда ваш браузер подключается к нему, он использует уникальный старт (обмен ключами hellman), если у ServerY нет закрытого ключа для вашего сертификата, который используется для вычисления открытого ключа на основе того, что браузер отправляет вам, он не может выдавать себя за серверXXX , –

+0

Sesh, что он * может * делать при определенных условиях, это то, что называется атакой «мешатель» или «человек в середине». Это позволяет ему воспроизводить клиент на сервер, сервер для клиента и перехватывать все. Есть защита от этого. Google «человек посередине» и SSL для получения дополнительной информации. –

6

Сертификат сервера подписан с закрытым ключом ЦС. Браузер использует открытый ключ CA для проверки подписи. Прямой связи между браузером и ЦС нет.

Важным моментом является то, что браузер поставляется с открытым ключом CA. В Firefox см. Инструменты-> Параметры-> Дополнительно-> Шифрование-> ПросмотрСертификаты-> Органы власти. Поэтому браузер знает заранее все CA, которым он может доверять.

Если вы этого не понимаете, изучите основы асимметричной криптографии и цифровых подписей.

Смежные вопросы