Смешанный контент HTTPs и HAProxy

Вопрос или проблема

У меня проблема с haproxy и смешанным контентом. Когда я пытаюсь подключиться через haproxy по SSL, браузер (в данном случае Firefox или Chrome), в конфигурации по умолчанию, блокирует смешанный контент – в данном случае HTTP-соединения. Это не происходит, когда я пытаюсь подключиться без haproxy.

Что может быть причиной этого?

Для справки:

Я установил haproxy версии 1.5.11

haproxy -v HA-Proxy version 1.5.11 2015/01/31 Copyright 2000-2015 Willy Tarreau

с этой конфигурацией:

global

log         127.0.0.1 local2

chroot      /var/lib/haproxy
pidfile     /var/run/haproxy.pid
maxconn     4000
user        haproxy
group       haproxy
stats timeout 30s
debug
daemon

# включить сокет для статистики
stats socket /var/lib/haproxy/admin.sock mode 660 level admin

# Путь к материалам SSL по умолчанию
ca-base /etc/ssl/certs
crt-base /etc/ssl/private

# Шифры по умолчанию для использования на SSL-активных сокетах.
# Для получения дополнительной информации смотрите ciphers(1SSL).

ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4
    SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL

defaults

log     global
mode    http
option  httplog
option  dontlognull
timeout connect 5000
timeout client  50000
timeout server  50000


frontend  webphp53_http

bind *:80
bind *:443 ssl crt /etc/ssl/private/cert.pem
    mode http
default_backend webphp53_servers

backend webphp53_servers

mode http
    balance roundrobin
    option forwardfor
    http-request set-header X-Forwarded-Port %[dst_port]
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
option httpchk HEAD / HTTP/1.1\r\nHost:localhost
server php53_node1 192.168.127.67:80 check
server php53_node2 192.168.127.68:80 check

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

Я обнаружил, что проблема возникает только при использовании CMS, такой как Drupal и WordPress. Я нашел решение – заставить обе системы использовать HTTPS. В случае с Drupal нужно отредактировать файл sites/default/settings.php и раскомментировать строку:

$base_url=”https://domain_name_blablabla“;

В случае с WordPress необходимо установить плагин WordPress HTTPS (SSL) https://wordpress.org/plugins/wordpress-https/

Ответ или решение

Смешанное содержимое (mixed content) является распространенной проблемой при использовании HTTPS и HAProxy, особенно когда речь идет о системах управления контентом (CMS) таких как Drupal и WordPress. Давайте более подробно разберем вашу проблему и предложим полное решение.

Причины проблемы

Когда вы используете HAProxy для управления подключениями SSL, браузеры, такие как Firefox и Chrome, блокируют HTTP-содержимое, если основное соединение было установлено через HTTPS. Это происходит по следующим причинам:

  1. Безопасность: Браузеры стремятся защитить пользователей от потенциальных угроз, связанных с загрузкой небезопасного содержимого (HTTP) на страницах, которые были загружены по безопасному протоколу (HTTPS).
  2. Политики Mixed Content: Если у вас на сайте есть ссылки на ресурсы, которые загружаются по HTTP, браузер заблокирует эти запросы, если основной контент загружен через HTTPS.

Решение

Шаг 1: Проверьте настройки HAProxy

Убедитесь, что HAProxy правильно настроен для обработки SSL. Ваша конфигурация на первый взгляд выглядит корректно, но есть несколько моментов, которые стоит проверить:

  • Убедитесь, что все запросы перенаправляются на HTTPS. Вы можете добавить правило перенаправления в секцию frontend:
frontend webphp53_http
    bind *:80
    redirect scheme https if !{ ssl_fc }
    bind *:443 ssl crt /etc/ssl/private/cert.pem
    mode http

Это правило перенаправит все HTTP-запросы на HTTPS.

Шаг 2: Настройки CMS

Для устранения проблемы с смешанным содержимым в CMS, таких как Drupal и WordPress, вам необходимо принудительно установить использование HTTPS.

Drupal:

  1. Откройте файл sites/default/settings.php.
  2. Найдите строку, которая объявляет $base_url. Включите HTTPS:
$base_url = "https://your_domain_name";

WordPress:

  1. Установите и активируйте плагин WordPress HTTPS (SSL).
  2. Настройте плагин, чтобы убедиться, что все ссылки и ресурсы загружаются через HTTPS.

Шаг 3: Проверка ссылок на ресурсы

Проверьте все ссылки на статические ресурсы (изображения, CSS, JavaScript) в вашей CMS. Убедитесь, что они указывают на HTTPS. Это также может требовать редактирования шаблонов или настроек плагинов.

Заключение

После выполнения всех вышеперечисленных шагов ваш сайт должен корректно обрабатывать соединения через HTTPS без блокировки смешанного содержимого. Убедитесь, что вы протестировали сайт после вносения изменений, чтобы убедиться, что все ресурсы загружаются безопасно. Если проблемы остаются, проверьте консоль разработчика в браузере на наличие дополнительных ошибок и скорректируйте настройки по мере необходимости.

Оцените материал
Добавить комментарий

Капча загружается...