6.3.2 Протоколы и шифры TLS защищённых соединений
MySQL поддерживает несколько протоколов и шифров TLS и позволяет настроить, какие протоколы и шифры разрешить для защищённых соединений. Также можно определить, какой протокол и шифр используется в текущем сеансе.
Поддерживаемые протоколы TLS для соединений
MySQL поддерживает защищённые соединения с использованием протоколов TLSv1, TLSv1.1 и TLSv1.2, упорядоченных от менее безопасного к более безопасному. Набор фактически разрешённых для соединений протоколов зависит от множества факторов:
Настройка MySQL. Разрешённые протоколы TLS можно настроить как на стороне сервера, так и на стороне клиента, включив только подмножество поддерживаемых протоколов TLS. На обеих сторонах должна быть хотя бы одна общая настройка протокола, иначе попытки соединения не смогут договориться о используемом протоколе. Подробности см. в Переговоры о протоколе TLS для соединений.
-
Настройка хоста. Система хоста может разрешать только определённые протоколы TLS, что означает, что подключения MySQL не могут использовать запрещённые протоколы, даже если сам MySQL их разрешает:
Предположим, что конфигурация MySQL разрешает TLSv1, TLSv1.1 и TLSv1.2, но конфигурация вашего хоста разрешает только подключения, использующие TLSv1.2 или более позднюю версию. В этом случае вы не сможете установить подключения MySQL, использующие TLSv1 или TLSv1.1, даже если MySQL настроен на их разрешение, потому что система хоста их не разрешает.
Если конфигурация MySQL разрешает TLSv1, TLSv1.1 и TLSv1.2, но конфигурация вашего хоста разрешает только подключения, использующие TLSv1.3 или более позднюю версию, вы вообще не сможете установить подключения MySQL, потому что ни один протокол, разрешённый MySQL, не разрешён системой хоста.
Решение этой проблемы включает:
-
Измените конфигурацию системы хоста, чтобы разрешить дополнительные протоколы TLS. Обратитесь к документации вашей операционной системы за инструкциями. Например, на вашей системе может быть файл
/etc/ssl/openssl.cnf, содержащий эти строки, чтобы ограничить протоколы TLS TLSv1.2 или более поздними:[system_default_sect] MinProtocol = TLSv1.2
Изменение значения на более раннюю версию протокола или
Noneделает систему более допускающей. Этот способ имеет недостаток, что разрешение более ранних (менее безопасных) протоколов может иметь неблагоприятные последствия для безопасности. Если вы не можете или не хотите изменять конфигурацию TLS системы хоста, измените приложения MySQL, чтобы использовать более поздние (более безопасные) протоколы TLS, разрешённые системой хоста. Это может быть невозможно для более старых версий MySQL, которые поддерживают только более ранние версии протоколов. Например, TLSv1 — единственный поддерживаемый протокол до MySQL 5.6.46, поэтому попытки подключения к серверу до 5.6.46 терпят неудачу, даже если клиент из более новой версии MySQL, поддерживающей более поздние версии протоколов. В таких случаях может потребоваться обновление до версии MySQL, которая поддерживает дополнительные версии TLS.
-
Библиотека SSL. Если библиотека SSL не поддерживает конкретный протокол, MySQL тоже не поддерживает его, и любые части дальнейшего обсуждения, которые указывают на этот протокол, не применимы.
При компиляции с использованием OpenSSL 1.0.1 или выше, MySQL поддерживает протоколы TLSv1, TLSv1.1 и TLSv1.2.
При компиляции с использованием yaSSL, MySQL поддерживает протоколы TLSv1 и TLSv1.1.
ПримечаниеMySQL можно скомпилировать с использованием yaSSL в качестве альтернативы OpenSSL только до MySQL 5.7.28. Начиная с MySQL 5.7.28, поддержка yaSSL удалена, и все сборки MySQL используют OpenSSL.
Настройка протоколов TLS для соединений
На стороне сервера значение системной переменной tls_version определяет, какие протоколы TLS сервер MySQL разрешает для защищённых соединений. Значение tls_version применяется к подключениям от клиентов и от серверов-реплик, использующих обычное реплицирование источник/реплика. Значение переменной — список одного или нескольких протоколов с разделителем запятая из этого списка (регистронезависимое): TLSv1, TLSv1.1, TLSv1.2. По умолчанию эта переменная перечисляет все протоколы, поддерживаемые библиотекой SSL, используемой для компиляции MySQL (TLSv1,TLSv1.1,TLSv1.2 для OpenSSL, TLSv1,TLSv1.1 для yaSSL). Для определения значения tls_version во время выполнения используйте данную команду:
mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
+---------------+-----------------------+
| Variable_name | Value |
+---------------+-----------------------+
| tls_version | TLSv1,TLSv1.1,TLSv1.2 |
+---------------+-----------------------+
Для изменения значения tls_version установите его во время запуска сервера. Например, для разрешения подключений, использующих протокол TLSv1.1 или TLSv1.2, но запрета подключений, использующих менее безопасный протокол TLSv1, используйте эти строки в файле конфигурации сервера my.cnf:
[mysqld]
tls_version=TLSv1.1,TLSv1.2
Чтобы ещё более ограничить и разрешить только подключения TLSv1.2, установите tls_version следующим образом (предполагая, что ваш сервер скомпилирован с использованием OpenSSL, так как yaSSL не поддерживает TLSv1.2):
[mysqld]
tls_version=TLSv1.2
Начиная с MySQL 5.7.35, протоколы подключения TLSv1 и TLSv1.1 устарели, и поддержка их может быть удалена в будущей версии MySQL. См. Устаревшие протоколы TLS.
На стороне клиента параметр --tls-version указывает, какие протоколы TLS клиентская программа разрешает для подключений к серверу. Формат значения параметра такой же, как для системной переменной tls_version, описанной ранее (список одного или нескольких протоколов с разделителем запятая).
Для реплицирования источник/реплика параметр MASTER_TLS_VERSION для оператора CHANGE MASTER TO указывает, какие протоколы TLS сервер-реплика разрешает для подключений к источнику. Формат значения параметра такой же, как для системной переменной tls_version, описанной ранее. См. Раздел 16.3.8, «Настройка репликации для использования защищённых соединений».
Протоколы, которые можно указать для MASTER_TLS_VERSION, зависят от библиотеки SSL. Этот параметр независим от и не зависит от значения серверной переменной tls_version. Например, сервер, который выступает в качестве реплики, может быть настроен со значением tls_version, установленным на TLSv1.2, чтобы разрешить только входящие подключения, использующие TLSv1.2, но также настроен с MASTER_TLS_VERSION, установленным на TLSv1.1, чтобы разрешить только TLSv1.1 для исходящих подключений реплики к источнику.
Настройка протокола TLS влияет на то, какой протокол использует данное подключение, как описано в Переговоры о протоколе TLS для соединений.
Разрешённые протоколы следует выбирать таким образом, чтобы не оставлять «дыр» в списке. Например, эти значения конфигурации сервера не содержат дыр:
tls_version=TLSv1,TLSv1.1,TLSv1.2
tls_version=TLSv1.1,TLSv1.2
tls_version=TLSv1.2
Это значение содержит дыру и не должно использоваться:
tls_version=TLSv1,TLSv1.2 (TLSv1.1 is missing)
Запрет дыр также применим и в других контекстах конфигурации, таких как для клиентов или реплик.
Если вы не хотите отключать защищённые соединения, список разрешённых протоколов не должен быть пустым. Если вы зададите параметр версии TLS пустой строкой, защищённые соединения не смогут быть установлены:
tls_version: Сервер не разрешает входящие защищённые подключения.--tls-version: Клиент не разрешает исходящие защищённые подключения к серверу.MASTER_TLS_VERSION: Реплика не разрешает исходящие защищённые подключения к источнику.
Устаревшие протоколы TLS
Начиная с MySQL 5.7.35, протоколы подключения TLSv1 и TLSv1.1 устарели, и поддержка их может быть удалена в будущей версии MySQL. (Для справки обратитесь к меморандуму IETF Deprecating TLSv1.0 and TLSv1.1.) Рекомендуется использовать более защищенные протоколы TLSv1.2 и TLSv1.3 для подключений. TLSv1.3 требует, чтобы как сервер MySQL, так и клиентское приложение были скомпилированы с OpenSSL 1.1.1 или более поздней версией.
На стороне сервера данная устарелость имеет следующие последствия:
Если переменной системы
tls_versionприсваивается значение, содержащее устаревший протокол TLS во время запуска сервера, сервер записывает предупреждение для каждого устаревшего протокола в журнал ошибок.Если клиент успешно подключается с использованием устаревшего протокола TLS, сервер записывает предупреждение в журнал ошибок.
На стороне клиента устарелость не имеет видимого эффекта. Клиенты не выдают предупреждение, если они настроены на разрешение устаревшего протокола TLS. Это включает в себя:
Клиентские программы, которые поддерживают опцию
--tls-versionдля указания протоколов TLS для подключений к серверу MySQL.Команды, которые позволяют репликам указать протоколы TLS для подключения к источнику. (
CHANGE MASTER TOимеет опциюMASTER_TLS_VERSION).
Настройка шифрования подключения
Для шифрованных подключений применяется набор стандартных шифров, который может быть изменён явным указанием разрешенных шифров. Во время установления подключения обе стороны должны разрешать общий шифр, иначе подключение завершается ошибкой. Из разрешенных шифров, общих для обеих сторон, библиотека SSL выбирает шифр, поддерживаемый предоставленным сертификатом, с наивысшим приоритетом.
Для указания шифра или шифров для шифрованных подключений задайте переменную системы ssl_cipher на стороне сервера и используйте опцию --ssl-cipher для клиентских программ.
Для подключений репликации/источника, где данный сервер является источником, задайте переменную системы ssl_cipher. Где этот сервер является репликой, используйте опцию MASTER_SSL_CIPHER для команды CHANGE MASTER TO. Смотрите Раздел 16.3.8, «Настройка репликации с использованием шифрованных подключений».
Данный шифр может работать только с определенными протоколами TLS, что влияет на процесс согласования протокола TLS. Смотрите Согласование протокола TLS подключения.
Чтобы определить, какие шифры поддерживает данный сервер, проверьте значение сессии переменной состояния Ssl_cipher_list:
SHOW SESSION STATUS LIKE 'Ssl_cipher_list';
Переменная состояния Ssl_cipher_list перечисляет возможные шифры SSL (пустое значение для подключений без SSL). Набор доступных шифров зависит от версии MySQL, от того, был ли MySQL скомпилирован с использованием OpenSSL или yaSSL, и (для OpenSSL) от версии библиотеки, используемой для компиляции MySQL.
Шифры ECDSA работают только в сочетании с сертификатом SSL, использующим ECDSA для цифровой подписи, и не работают с сертификатами, использующими RSA. Автоматический процесс генерации сертификатов SSL MySQL генерирует только сертификаты с подписью RSA, а не ECDSA. Не выбирайте шифры ECDSA, если у вас нет доступного сертификата ECDSA.
MySQL передает список стандартных шифров библиотеке SSL.
MySQL передает этот стандартный список шифров OpenSSL:
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES128-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-ECDSA-AES256-SHA384
ECDHE-RSA-AES256-SHA384
DHE-RSA-AES128-GCM-SHA256
DHE-DSS-AES128-GCM-SHA256
DHE-RSA-AES128-SHA256
DHE-DSS-AES128-SHA256
DHE-DSS-AES256-GCM-SHA384
DHE-RSA-AES256-SHA256
DHE-DSS-AES256-SHA256
ECDHE-RSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA
ECDHE-RSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA
DHE-DSS-AES128-SHA
DHE-RSA-AES128-SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
DHE-RSA-AES256-SHA
AES128-GCM-SHA256
DH-DSS-AES128-GCM-SHA256
ECDH-ECDSA-AES128-GCM-SHA256
AES256-GCM-SHA384
DH-DSS-AES256-GCM-SHA384
ECDH-ECDSA-AES256-GCM-SHA384
AES128-SHA256
DH-DSS-AES128-SHA256
ECDH-ECDSA-AES128-SHA256
AES256-SHA256
DH-DSS-AES256-SHA256
ECDH-ECDSA-AES256-SHA384
AES128-SHA
DH-DSS-AES128-SHA
ECDH-ECDSA-AES128-SHA
AES256-SHA
DH-DSS-AES256-SHA
ECDH-ECDSA-AES256-SHA
DHE-RSA-AES256-GCM-SHA384
DH-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-GCM-SHA256
DH-RSA-AES256-GCM-SHA384
ECDH-RSA-AES256-GCM-SHA384
DH-RSA-AES128-SHA256
ECDH-RSA-AES128-SHA256
DH-RSA-AES256-SHA256
ECDH-RSA-AES256-SHA384
ECDHE-RSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA
ECDHE-RSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA
DHE-DSS-AES128-SHA
DHE-RSA-AES128-SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
DHE-RSA-AES256-SHA
AES128-SHA
DH-DSS-AES128-SHA
ECDH-ECDSA-AES128-SHA
AES256-SHA
DH-DSS-AES256-SHA
ECDH-ECDSA-AES256-SHA
DH-RSA-AES128-SHA
ECDH-RSA-AES128-SHA
DH-RSA-AES256-SHA
ECDH-RSA-AES256-SHA
DES-CBC3-SHA
MySQL передает этот стандартный список шифров yaSSL:
DHE-RSA-AES256-SHA
DHE-RSA-AES128-SHA
AES128-RMD
DES-CBC3-RMD
DHE-RSA-AES256-RMD
DHE-RSA-AES128-RMD
DHE-RSA-DES-CBC3-RMD
AES256-SHA
RC4-SHA
RC4-MD5
DES-CBC3-SHA
DES-CBC-SHA
EDH-RSA-DES-CBC3-SHA
EDH-RSA-DES-CBC-SHA
AES128-SHA:AES256-RMD
Начиная с MySQL 5.7.10, действуют следующие ограничения на шифры:
-
Следующие шифры постоянно заблокированы:
!DHE-DSS-DES-CBC3-SHA !DHE-RSA-DES-CBC3-SHA !ECDH-RSA-DES-CBC3-SHA !ECDH-ECDSA-DES-CBC3-SHA !ECDHE-RSA-DES-CBC3-SHA !ECDHE-ECDSA-DES-CBC3-SHA
-
Следующие категории шифров постоянно заблокированы:
!aNULL !eNULL !EXPORT !LOW !MD5 !DES !RC2 !RC4 !PSK !SSLv3
Если сервер запускается с переменной системы ssl_cert, установленной в сертификат, использующий любой из предыдущих заблокированных шифров или категорий шифров, сервер запускается с отключенной поддержкой шифрованных подключений.
Согласование протокола TLS подключения
Попытки подключения в MySQL согласовывают использование наиболее высокой версии протокола TLS, доступной для обеих сторон, для которой на обеих сторонах доступен совместимый шифр. Процесс согласования зависит от таких факторов, как используемая библиотека SSL для компиляции сервера и клиента, конфигурация протокола TLS и шифра, а также используемый размер ключа:
Для успешного подключения сервер и клиент TLS должны разрешать общий протокол.
Аналогично, конфигурация шифра сервера и клиента должна разрешать общий шифр. Данный шифр может работать только с определенными протоколами TLS, поэтому протокол, доступный для процесса согласования, не выбирается, если нет совместимого шифра.
-
Если сервер и клиент скомпилированы с использованием OpenSSL, используется TLSv1.2, если это возможно. Если сервер или клиент, или оба, скомпилированы с использованием yaSSL, используется TLSv1.1, если это возможно. («Возможно» означает, что конфигурация сервера и клиента должна разрешать указанный протокол, и обе должны также разрешать совместимый шифр.) В противном случае MySQL продолжает перебирать список доступных протоколов, переходя от более безопасных к менее безопасным. Порядок согласования не зависит от порядка настройки протоколов. Например, порядок согласования одинаков независимо от того, содержит ли
tls_versionзначениеTLSv1,TLSv1.1,TLSv1.2илиTLSv1.2,TLSv1.1,TLSv1.ПримечаниеДо MySQL 5.7.10 MySQL поддерживает только TLSv1 для OpenSSL и yaSSL, и нет переменной системы или опции клиента для указания разрешенных протоколов TLS.
-
TLSv1.2 не работает со всеми шифрами, имеющими размер ключа 512 бит или меньше. Чтобы использовать этот протокол с таким ключом, установите переменную системы
ssl_cipherна стороне сервера или используйте опцию клиента--ssl-cipherдля явного указания имени шифра:AES128-SHA AES128-SHA256 AES256-SHA AES256-SHA256 CAMELLIA128-SHA CAMELLIA256-SHA DES-CBC3-SHA DHE-RSA-AES256-SHA RC4-MD5 RC4-SHA SEED-SHA
Для повышения безопасности используйте сертификат с размером ключа RSA не менее 2048 бит.
Если сервер и клиент не имеют общего разрешенного протокола и совместимого шифра, сервер прерывает запрос подключения. Примеры:
-
Если сервер настроен с
tls_version=TLSv1.1,TLSv1.2:Попытки подключения завершаются ошибкой для клиентов, вызванных с
--tls-version=TLSv1, и для устаревших клиентов, поддерживающих только TLSv1.Аналогично, попытки подключения завершаются ошибкой для реплик, настроенных с
MASTER_TLS_VERSION = 'TLSv1', и для устаревших реплик, поддерживающих только TLSv1.
-
Если сервер настроен с
tls_version=TLSv1или является устаревшим сервером, поддерживающим только TLSv1:Попытки подключения завершаются ошибкой для клиентов, вызванных с
--tls-version=TLSv1.1,TLSv1.2.Аналогично, попытки подключения завершаются ошибкой для реплик, настроенных с
MASTER_TLS_VERSION = 'TLSv1.1,TLSv1.2'.
MySQL разрешает указание списка поддерживаемых протоколов. Этот список передается непосредственно в базовую библиотеку SSL, и в конечном итоге от этой библиотеки зависит, какие протоколы фактически разрешаются из предоставленного списка. Обратитесь к исходному коду MySQL и документации OpenSSL SSL_CTX_new() для получения информации о том, как библиотека SSL обрабатывает это.
Мониторинг текущего протокола TLS сессии клиента и шифра
Чтобы определить, какой протокол шифрования TLS и шифр использует текущая сессия клиента, проверьте значения сессии переменных состояния Ssl_version и Ssl_cipher:
mysql> SELECT * FROM performance_schema.session_status
WHERE VARIABLE_NAME IN ('Ssl_version','Ssl_cipher');
+---------------+---------------------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+---------------------------+
| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 |
| Ssl_version | TLSv1.2 |
+---------------+---------------------------+
Если подключение не зашифровано, оба значения переменных пусты.
© 2025 Oracle
Licensed under the GPLv2 License.