OpenSSL, публичные ключи и приватные ключи - PullRequest
3 голосов
/ 21 марта 2011

Я недавно экспериментировал с API OpenSSL в C, и меня смущают некоторые функции настройки, а также некоторые концепции в криптографии с открытым ключом в целом.

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

Однако меня немного смущает вопрос, когда вам на самом деле нужен Открытый ключ. Например, понадобится ли веб-браузеру открытый ключ? Я бы подумал, что нет, поскольку кажется, что в большинстве случаев общему ключу нужен только сервер (не клиент). Если у сервера и клиента есть открытый ключ, какой из них используется?

В дополнение к моему заблуждению, факт, что OpenSSL API определяет функцию SSL_CTX_use_PrivateKey_file(), но не соответствует SSL_CTX_use_PublicKey_file(). В своих экспериментах я написал простой веб-клиент, который подключается к веб-сайту https и загружает файл. Он отлично работает, и открытый ключ не нужен. Я просто создал закрытый ключ, используя инструменты командной строки OpenSSL, а затем вызвал SSL_CTX_use_PrivateKey_file() в моей программе.

Но если бы я писал сервер , в отличие от клиента, мне не понадобился бы открытый ключ? И если так, то почему я не вижу ничего подобного use_PublicKey_file в OpenSSL API?

Ответы [ 4 ]

1 голос
/ 22 марта 2011

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

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

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

0 голосов
/ 21 марта 2011

Как правило, закрытые ключи предназначены для расшифровки, открытые ключи - для шифрования и проверки.

Я не очень знаком с интерфейсами OpenSSL C, но я полагаю, что вы на самом деле ничего не делаетес ключом, который вы загрузили из файла.Используемая вами процедура загрузки заключается в проверке сертификата веб-сервера, проверке его подписи в известной цепочке подписывающих органов, а затем согласовании потока шифрования tls (общего шифра).

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

TLS RFC содержит все подробности.

0 голосов
/ 22 марта 2011

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

В «обычном» (не аутентифицированном клиентом) SSLсоединение, есть одна пара ключей, пара ключей сервера.Сервер знает свой собственный закрытый ключ, и клиент должен знать открытый ключ сервера, который обычно поставляется в форме сертификата, который подписан секретным ключом какого-либо центра сертификации.Поэтому, когда клиент впервые подключается к серверу, первым делом сервер отправляет свой сертификат открытого ключа (так, чтобы он у клиента).Клиент аутентифицирует сертификат, используя открытый ключ CA (который должен быть встроен или предварительно загружен). Затем клиент создает «секретный» (случайное число) и шифрует его с помощью открытого ключа сервера и отправляет его на сервер.который может расшифровать его с помощью своего закрытого ключа.Этот секрет затем используется для заполнения ключа для симметричного шифра, который используется для дальнейшего обмена данными.

В аутентифицированном соединении SSL и клиент, и сервер имеют закрытые ключи и предоставляют свои сертификаты (с соответствующими открытыми ключами).) через соединение до установления безопасного соединения.

0 голосов
/ 21 марта 2011

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

В качестве клиента для получения открытого ключа сервера вы будете использовать сертификат SSL_CTX_use_certificate_file. Сертификат содержит открытый ключ и обычно проверяется доверенным издателем сертификата. Это гарантирует клиенту подлинность сервера, если вы доверяете издателю сертификата. Веб-браузеры поставляются с набором доверенных издателей сертификатов, чтобы они могли проверять сертификаты, которые будут загружены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...