Вопрос или проблема
Мне нужно использовать платежный сервис для моего проекта, поэтому я создал API с методом GET. Я отправил его провайдеру, и он сказал, что все работает. Однако наша система не может работать с этим API, потому что вы используете TLSv1.3, а мы используем 1.2. Чтобы решить эту проблему, я создал поддомен и попытался изменить TLSv только для этого поддомена.
Для SSL-сертификата я использую “Let’s Encrypt”.
Вот мой pay.example.conf
<VirtualHost *:80>
# Директива ServerName устанавливает схему запроса, имя хоста и порт, которые
# сервер использует для идентификации себя. Это используется при создании
# URL перенаправлений. В контексте виртуальных хостов, ServerName
# указывает, какое имя хоста должно появиться в заголовке Host: запроса, чтобы
# совпасть с этим виртуальным хостом. Для виртуального хоста по умолчанию (этого файла) это
# значение не является решающим, так как используется в качестве последнего средства хоста в любом случае.
# Однако, вы должны явно задать его для любого следующего виртуального хоста.
#ServerName www.example.com
ServerAdmin webmaster@localhost
ServerName pay.example.com
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Включение только TLS 1.2
SSLProtocol TLSv1.2
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder on
# Доступные уровни логирования: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# Также возможно настроить уровень логирования для конкретных
# модулей, например
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Для большинства файлов конфигурации из conf-available/,
# которые включены или отключены на глобальном уровне, возможно
# включить строку только для одного конкретного виртуального хоста. Например,
# следующая строка включает конфигурацию CGI для этого хоста только
# после того, как она была глобально отключена с "a2disconf".
#Include conf-available/serve-cgi-bin.conf
# RewriteEngine on
# RewriteCond %{SERVER_NAME} =pay.example.com
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
Вот pay.example-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
# Директива ServerName устанавливает схему запроса, имя хоста и порт, которые
# сервер использует для идентификации себя. Это используется при создании
# URL перенаправлений. В контексте виртуальных хостов, ServerName
# указывает, какое имя хоста должно появиться в заголовке Host: запроса, чтобы
# совпасть с этим виртуальным хостом. Для виртуального хоста по умолчанию (этого файла) это
# значение не является решающим, так как используется в качестве последнего средства хоста в любом случае.
# Однако, вы должны явно задать его для любого следующего виртуального хоста.
#ServerName www.example.com
ServerAdmin webmaster@localhost
ServerName pay.example.com
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Включение только TLS 1.2
SSLEngine on
SSLProtocol -all +TLSv1.2
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder on
# Доступные уровни логирования: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# Также возможно настроить уровень логирования для конкретных
# модулей, например
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Для большинства файлов конфигурации из conf-available/,
# которые включены или отключены на глобальном уровне, возможно
# включить строку только для одного конкретного виртуального хоста. Например,
# следующая строка включает конфигурацию CGI для этого хоста только
# после того, как она была глобально отключена с "a2disconf".
#Include conf-available/serve-cgi-bin.conf
RewriteEngine on
# Некоторые правила перезаписи в этом файле были отключены на вашем HTTPS-сайте,
# потому что они имеют потенциал создания циклов перенаправления.
# RewriteCond %{SERVER_NAME} =pay.example.com
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
SSLCertificateFile /etc/letsencrypt/live/pay.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pay.example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
он возвращает успех с 1.2 1.3 1.1
curl -v https://pay.example.com --tlsv1.2
Что я могу сделать в это время?
Ответ или решение
В этой статье мы рассмотрим, как изменить версию TLS на сервере Apache для конкретного поддомена, чтобы она использовала TLS 1.2. Из вашего описания ясно, что вы использовали конфигурацию для SSL-протоколов, но, несмотря на ваши настройки, ваш сервер по-прежнему поддерживает несколько версий TLS, включая TLS 1.3, TLS 1.2 и TLS 1.1. Мы пройдемся по теоретическим аспектам, приведем примеры, а затем рассмотрим, как применять эти знания на практике, чтобы решить вашу задачу.
Теория
TLS и его важность: TLS (Transport Layer Security) — это протокол, обеспечивающий защиту данных при их передаче по сети. Существует несколько версий TLS, начиная от 1.0 и заканчивая 1.3. Каждая последующая версия, как правило, безопаснее предыдущей за счет исправления уязвимостей и улучшения механизмов шифрования. Однако совместимость с некоторыми старыми системами может потребовать использования конкретной версии, такой как TLS 1.2.
Конфигурация Apache для TLS: Apache позволяет настраивать какие версии TLS и наборы шифров могут использоваться для каждого виртуального хоста. Это означает, что вы можете задать различные параметры для разных доменов или поддоменов на одном сервере, как это необходимо в вашем случае. Основные директивы для управления версиями TLS — это SSLProtocol
и SSLCipherSuite
.
Пример
Ваш текущий конфигурационный файл pay.example-le-ssl.conf
содержит следующие ключевые строки для TLS настройки:
SSLEngine on
SSLProtocol -all +TLSv1.2
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder on
Применение
Проверка конфигурации
-
Директива SSLProtocol:
- Текущая настройка:
SSLProtocol -all +TLSv1.2
- Она должна блокировать все версии TLS, кроме 1.2. Однако исходя из того, что ваши попытки все же показывают поддержку других версий, возможно, существует конфигурация, которая переопределяет эту настройку.
- Текущая настройка:
-
Поиск глобальных конфигураций:
- Проверьте конфигурационные файлы Apache, такие как
ssl.conf
, которые могут содержать инструкции, переопределяющие значения в вашем виртуальном хосте. - Настройки в
/etc/letsencrypt/options-ssl-apache.conf
могут также содержать более расслабленные директивы, которые добавляют поддержку нежелательных TLS версий.
- Проверьте конфигурационные файлы Apache, такие как
-
Актуализация конфигурации:
- Убедитесь, что в
options-ssl-apache.conf
или других включаемых файлах нет директив, конфликтующих с вашим VirtualHost. Если такие директивы найдены, сконфигурируйте их соответствующе или удалите/переопределите конкретно для вашего Виртуального хоста.
- Убедитесь, что в
Диагностика и перепроверка
-
Перезапуск Apache:
- После внесения изменений убедитесь, что вы перезапустили Apache:
sudo systemctl restart apache2
.
- После внесения изменений убедитесь, что вы перезапустили Apache:
-
Тестирование конфигурации:
- Используйте различные версии TLS через инструмент
curl
, чтобы проверить использование только той версии, которую вы настроили:curl -v --tls-max 1.2 https://pay.example.com
- Если при тестировании установлено, что другие версии TLS все еще активны, следует искать скрытые переопределения в глобальных конфигурациях.
- Используйте различные версии TLS через инструмент
Дополнительные меры
-
Логирование и аудит: На момент отладки включите более высокий уровень логирования для модуля SSL, чтобы получить больше информации о происходящем. Это можно сделать следующим образом:
LogLevel info ssl:debug
-
Проверка на внешних сайтах: После внесения всех изменений можно проверить настройки вашего SSL через онлайн-сервис, такой как Qualys SSL Labs, чтобы удостовериться, что сервер использует только TLS 1.2.
Заключение
Настройки Apache для поддержки конкретной версии TLS могут быть неочевидными и иметь конфликты из-за перекрывающихся конфигураций. Регулярный аудит конфигураций и использование детализированного логирования помогут устранить большинство проблем. Если после всех изменений проблема остается, возможно, стоит обратиться за дополнительной поддержкой к специалисту по безопасности сетей.