Как стать автором
Обновить

Укрепляем HTTPS на стороне клиента (под Windows)

Время на прочтение9 мин
Количество просмотров8.4K

В рамках проекта «Монитор госсайтов» мы регулярно сталкиваемся с недостаточно защищенными и даже откровенно «дырявыми» веб-серверами, причем сообщения о найденных проблемах и уязвимостях их администраторы зачастую игнорируют. Поскольку на этих серверах размещены государственные сайты, просто отказаться от их посещения не получится. Что посетитель таких сайтов может противопоставить безалаберности их администраторов на стороне клиента?

У Microsoft довольно своеобразное представление о поддержке шифрованного протокола HTTPS в своей операционной системе. Если Mozilla завезла поддержку TLS версии 1.3 в Firefox еще во времена Windows XP, то Microsoft на уровне ОС стала поддерживать ее лишь в Windows 10. Не менее своеобразное представление у корпорации и об ассортименте поддерживаемых шифронаборов. К счастью, ситуацию можно улучшить путем настройки скрытых и не очень параметров Windows.

Для начала вспомним основы.

1. Большинство программ, осуществляющих доступ в Интернет под ОС Windows, используют для этого функционал и настройки операционной системы (Secure Channel – SChannel). Браузеры, включая Google Chrome, почтовые и FTP-клиенты, утилиты обновления какого-нибудь Adobe Creative Suite и т.д. и т.п. – все они выходят в Интернет посредством SChannel. Исключение составляют лишь программы, включающие собственные криптобиблиотеки для этих целей, например, Mozilla Firefox.

Но есть нюанс
Если вы используете официально не поддерживаемую ОС версию программы, она может своеобразно работать с SChannel. Например, существует «народный» способ установки Почты Windows от Windows Vista в Windows 7, из которой Microsoft зачем-то выпилила этот почтовый клиент. И тут нас ждет сюрприз: Почта Windows в Windows 7 сможет работать только с шифронаборами из Windows Vista (то есть, не сможет работать ни с одним AEAD шифронабором), хотя по идее должна была бы полагаться на SChannel из Windows 7.

2. При согласовании параметров TLS-соединения сервер должен учитывать предпочтения клиента в отношении используемых шифронаборов и эллиптических кривых. Но если эти предпочтения не заданы, а руки у администратора сервера растут из того места, откуда у нормальных людей растут ноги, наше HTTPS-соединение может оказаться «защищено» SSL 2.0, даже при том, что обе стороны поддерживают TLS 1.3.

Настройки SChannel содержатся в ветви реестра HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel и большая часть из них имеет «говорящее» название.

Разделы Ciphers, Hashes и др., параметр Enabled может принимать значения типа DWORD: ffffffff – включено, 00000000 – отключено.

Раздел Diffie-Hellman отвечает за алгоритм обмена ключом DHE, раздел ECDH – за ECDHE (шифронаборы на основании алгоритма обмена ключом DH и ECDH, т.е. без одноразового DH-ключа, ОС Windows не поддерживает), раздел PKCS – за RSA.

Параметр ServerMinKeyBitLength раздела Diffie-Hellman может принимать значения типа DWORD, соответствующие минимальной длине модуля DH-группы: 00000400 – 1024 бит, 00000800 – 2048 бит, 00000c00 – 3072 бит и 00001000 – 4096 бит.

В разделе Protocols существуют подразделы Client и Server, задающие раздельные настройки для компьютера, выступающего в роли клиента и сервера. Параметры Enabled и DisabledByDefault могут принимать значения типа DWORD: 00000000 – нет, 00000001 – да. Не спрашивайте, в чем тут логика, просто задайте непротиворечивые значения обоих параметров.

Таким образом мы можем задать настройки поддерживаемых протоколов защиты транспортного уровня и их версий и список поддерживаемых криптографических алгоритмов. Также мы можем явно задать поддерживаемые шифронаборы и эллиптические кривые в ветви HKLM\Software\Policies\Microsoft\Cryptography\Configuration\SSL\00010002 содержащей параметр строкового типа Functions и мультистроковой параметр (только в Windows 10 и 11) EccCurves.

Первый параметр содержит список разрешенных к использованию шифронаборов, перечисленных через запятую (без пробелов) согласно определенному формату, поэтому его лучше задавать через групповую политику, снабженную соответствующей справкой: Конфигурация компьютера/Административные шаблоны/Сеть/Параметры настройки SSL/Порядок комплектов шифров SSL (в зависимости от версии Windows название политики может слегка различаться). Второй (только в Windows 10 и 11) в групповой политике называется «Порядок кривой ECC» и задает список и порядок предпочтения разрешенных к использованию эллиптических кривых.

В итоге мы получим, например, такие значения (не спешите импортировать их в реестр):
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 128/128]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 256/256]
"Enabled"=dword:ffffffff

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\DES 56/56]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\NULL]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 128/128]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 40/128]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 56/128]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 128/128]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 40/128]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 56/128]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 64/128]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\Triple DES 168]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA256]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA384]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA512]
"Enabled"=dword:ffffffff

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman]
"Enabled"=dword:ffffffff

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\ECDH]
"Enabled"=dword:ffffffff
"ServerMinKeyBitLength"=dword:00000800

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:ffffffff
"DisabledByDefault"=dword:00000000


Для Windows 7-8.1
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002]
"Functions"="TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"


Для Windows 10-11
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server]
"Enabled"=dword:ffffffff
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002]
"Functions"="TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"
"EccCurves"=hex(7):63,00,75,00,72,00,76,00,65,00,32,00,35,00,35,00,31,00,39,00,00,00,6e,00,69,00,73,00,74,00,50,00,35,00,32,00,31,00,00,00,6e,00,69,00,73,00,74,00,50,00,33,00,38,00,34,00,00,00,6e,00,69,00,73,00,74,00,50,00,32,00,35,00,36,00,00,00,00,00

Данные настройки допускают использование в SChannel только протокола TLS версии не ниже 1.2, только AEAD-шифронаборов (на основе алгоритма шифрования AES, ChaCha20 клиентскими версиями Windows не поддерживается), модуля группы не менее 2048 бит при использовании алгоритма согласования ключей DHE и только эллиптических кривых Curve25519, NIST P-521, NIST P-384 и NIST P-256.

Некоторые из вышеупомянутых настроек становятся доступны лишь после применения соответствующего обновления для ОС, информация о котором для неподдерживаемых систем может быть уже убрана с сайта Microsoft (к таким относится, например, KB3174644 и его замены, которые якобы существует только для Windows 8 и выше).

А теперь о том, почему вышеприведенные настройки не стоит бездумно импортировать в реестр. Настройки SChannel действуют на все программы, которые полагаются на него, в том числе почтовые клиенты, а настройки используемого вами почтового сервера могут оказаться весьма «консервативными» и чтобы не остаться без почты придется в конец нашего красивого списка добавить какой-нибудь менее устойчивый шифронабор.

Для удобства настройки можно воспользоваться утилитой IIS Crypto, которая, увы, не полностью поддерживает Windows 10 и выше. Стоит также обратить внимание на опцию «Only use FIPS algorithms», то есть использовать только одобренные Федеральным стандартом обработки информации (FIPS 140) «сильные» алгоритмы, к которым, например, относится шифронабор TLS_RSA_WITH_3DES_EDE_CBC_SHA, все компоненты которого сегодня считаются слабыми либо уязвимыми.

На этом наши возможности по настройке SChannel исчерпываются, более тонкие настройки TLS могут быть доступны уже в конкретной программе, об одной из которых мы и поговорим дальше – браузере Mozilla Firefox.

Firefox использует собственную криптобиблиотеку – Network Security Services (NSS), поэтому настройки SChannel для него – что мертвому припарки, зато введя в адресной строке about:config мы попадем в мир, полный приключений тонких настроек, в том числе и связанных с TLS.

Нас интересуют 3 раздела: security.ssl, security.ssl3 и security.tls Большинство опций в них имеют говорящие названия и очевидные варианты: true/false, но некоторые нуждаются в пояснениях (которые Mozilla предоставить не потрудилась).

security.tls.version.enable-deprecated true/false – включает или отключает в принципе (на это влияют и другие настройки) поддержку TLS версий 1.0 и 1.1

security.tls.version.min, security.tls.version.max и security.tls.version.fallback-limit 0/1/2/3/4 Значение 0 соответствует SSL 3.0, а 4 – TLS 1.3. Первый параметр задает минимальную поддерживаемую версию протокола шифрования, второй – максимальную, третий – минимальную версию, на которую браузер может согласиться при ошибке согласования используемой версии с сервером.

К сожалению, мне не удалось найти никакой официальной информации о параметре security.tls.hello_downgrade_check Судя по его названию и дефолтному значению true, это аналог Fallback Signaling Cipher Suite Value на стороне клиента, а судя по неофициальной информации – как раз наоборот. Если кто подскажет ссылку на официальную информацию по этому поводу, буду признателен.

PS: коллективный разум помог понять, в чем тут дело было
В комментах прояснили ситуацию: это таки вшитый в TLS 1.3 аналог Fallback SCSV, в реализации которого в Firefox была ошибка, поэтому его советовали отключать, чего сегодня (после исправления ошибки) делать уже не следует.

Путем настройки ОС и браузера вы сможете закрыть для себя большинство «дыр» в серверах, настроенных криворукими админами, а для проверки, чего вы сами нарукоблудили с настройками, существуют, например, такие сервисы, как How's My SSL? и SSL Client Test.
Теги:
Хабы:
Всего голосов 7: ↑7 и ↓0+7
Комментарии22

Публикации

Истории

Работа

Ближайшие события

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн