Безопасность и TLS рукопожатие, когда клиент аутентифицирован - PullRequest
2 голосов
/ 31 июля 2011

В рукопожатии TLS, настроенном с аутентификацией клиента, есть этап, на котором сервер получает сертификат клиента и решает, доверять ему или нет (например, в Java это делается через TrustManager).

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

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

Примечание: Риск реален, когда TLS используется в контексте с конкретными требованиями безопасности.Например, давайте предположим, что приложение P2P, которое использует TLS между пирами, и которое использует TrustManager как способ аутентификации пиров из его списка контактов.Этот список контактов должен быть закрытым.Интернет-провайдер может перечислить IP-адреса, с которыми связывается узел, затем получить свой общедоступный сертификат, запустив с ним рукопожатие TLS, затем он может попытаться соединить друг с другом узлы в списке IP-адресов.В конце концов, интернет-провайдер может получить большую часть списка контактов, который должен был быть закрытым.

Ответы [ 2 ]

2 голосов
/ 31 июля 2011

OpenSSL также проверяет сертификат клиента сразу же после его получения в сообщении сертификата клиента.

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

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

2 голосов
/ 31 июля 2011

Это зависит от реализации.Наша реализация немедленно отправляет ошибку, как и для других реализаций - я полагаю, большинство делает то же самое.

Однако это не имеет значения: сервер отправляет определенный код ошибки (BadCertificate), если сертификат недействителен, поэтому независимо от того, когда этот код отправлен, злоумышленник будет знать, чтоСертификат не был принят.Защита сервера от этой атаки потребовала бы, чтобы сервер отправил другой код ошибки, и это могло бы сбить с толку законных клиентов.

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

...