Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Решение проблем
В этой статье представлены наиболее частые проблемы проверки подлинности при использовании SslStream функций шифрования и безопасности, связанных с .NET, реализуются взаимодействием с API ОС (например, Schannel в Windows) или низкоуровневыми системными библиотеками (например, OpenSSL в Linux). Поведение приложения .NET, включая сообщения об исключениях и коды ошибок, может измениться в зависимости от того, какая платформа выполняется.
Некоторые проблемы могут быть проще исследовать и устранять неполадки, наблюдая за фактическими сообщениями, обменяемыми по проводу, с помощью таких средств, как Wireshark или tcpdump. Эти средства можно использовать для проверки сообщений ClientHello, ServerHello и других сообщений на предмет рекламируемых поддерживаемых версий TLS, разрешенных и согласованных наборов шифров, а также сертификатов, которыми обмениваются для аутентификации.
Промежуточные сертификаты не отправляются
Во время рукопожатия TLS сервер и клиент тоже, если требуется аутентификация клиента, отправляют сертификат, чтобы подтвердить свою личность клиенту. Чтобы проверить подлинность сертификата, необходимо создать и проверить цепочку сертификатов. Корень цепочки сертификатов должен принадлежать к доверенным корневым центрам сертификации, и его сертификат хранится в хранилище сертификатов компьютера.
Если сертификат однорангового узла не был выдан одним из доверенных ЦС, то для построения цепочки сертификатов необходим промежуточный сертификат ЦС. Однако если промежуточный сертификат недоступен, невозможно проверить сертификат и рукопожатие TLS может завершиться ошибкой.
Эта проблема чаще всего возникает в Windows. Несмотря на то, что приложение предоставило промежуточные сертификаты с помощью параметров проверки подлинности, они не будут отправляться в одноранговый узел, если они не хранятся в хранилище сертификатов Windows. Это ограничение обусловлено тем, что фактическое рукопожатие TLS происходит вне процесса приложения.
Для серверных приложений можно передать SslStreamCertificateContext в качестве SslServerAuthenticationOptions.ServerCertificateContext. Во время создания экземпляра SslStreamCertificateContext можно передать дополнительные промежуточные сертификаты, и они будут временно добавлены в хранилище сертификатов.
К сожалению, для клиентского приложения единственным решением является добавление сертификатов в хранилище сертификатов вручную.
Ошибка рукопожатия с временными ключами
В Windows при попытке использовать сертификаты с временными ключами может возникнуть (0x8009030E): No credentials are available in the security package сообщение об ошибке. Это поведение связано с ошибкой в базовом API ОС (Schannel). Дополнительные сведения и обходные пути можно найти в связанной проблеме GitHub.
Клиент и сервер не обладают общим алгоритмом
При проверке сообщений ClientHello и ServerHello, вы можете выяснить, что ни клиент, ни сервер не предлагают набор шифров, или что некоторые шифры вовсе не предлагаются, даже если они явно настроены через CipherSuitesPolicy (доступно только для Linux). Базовая библиотека TLS может отключить версии TLS и наборы шифров, которые считаются небезопасными.
Во многих дистрибутивах Linux соответствующий файл конфигурации находится по адресу /etc/ssl/openssl.cnf.
В Windows, командлеты PowerShell Enable-TlsCipherSuite и Disable-TlsCipherSuite можно использовать для настройки наборов шифров. Отдельные версии TLS можно включить или отключить, настроив HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS <version>\{Client|Server}\Enabled раздел реестра.