OpenSSL и s_client - почему требуется закрытый ключ от клиента? - программирование
Подтвердить что ты не робот

OpenSSL и s_client - почему требуется закрытый ключ от клиента?

Мне нужно настроить двухсторонний канал связи SSL между приложением .NET/WCF и сторонним веб-сервером. Сейчас я пытаюсь получить успешное рукопожатие с хостом, чтобы проверить правильность установки всех элементов (сертификат клиента, полномочия сервера, сетевая связь...). Я использую инструмент командной строки openSSL, чтобы попробовать и проверить это, используя команду s_client.

Вот что меня останавливает, и чего я не понимаю:

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

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

сертификат клиента был предоставлен мне третьим лицом, но он делает не содержит личный ключ

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

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