Назад | Перейти на главную страницу

Прокси-сервер HTTPS, который отвечает на CONNECT собственным сертификатом

Я настраиваю DMZ, которая имеет следующую схему:

Internet - Server A - Security Appliance - Server B - Intranet

В этой DMZ мне нужен прокси-сервер для http (s) соединений из интрасети в Интернет. Проблема в том, что весь трафик должен сканироваться устройством безопасности. Для этого мне нужно разорвать SSL-соединение на сервере B, проксировать его как простой http на сервер A через Security Appliance, а затем как https в Интернет. Затем между клиентом и сервером B и целевым сервером и сервером A происходит постоянное шифрование. Связь между сервером A и сервером B не зашифрована. Я знаю о рисках безопасности и о том, что клиент увидит предупреждение о неизвестном CA сертификата сервера B.

В качестве программного обеспечения я хочу использовать веб-серверы Apache на сервере A и сервере B.

В качестве первого шага я попытался настроить сервер B, чтобы он служил конечной точкой для шифрования SSL. Таким образом, он должен установить шифрование с клиентом (отвечая на HTTP CONNECT).

Listen 8443
<VirtualHost *:8443>
    ProxyRequests On
    ProxyPreserveHost On
    AllowCONNECT 443
    # SSL
    ErrorLog logs/ssl_error_log
    TransferLog logs/ssl_access_log
    LogLevel debug
    SSLProxyEngine on
    SSLProxyMachineCertificateFile /etc/pki/tls/certs/localhost_private_public.crt
    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 192.168.0.0/22
    </Proxy>
</VirtualHost>

С этим прокси-сервером проходит только запрос CONNECT и устанавливается зашифрованное соединение между клиентом и целью. К сожалению, нет возможности настроить mod_proxy_connect для расшифровки SSL-соединения. Есть ли возможность выполнить такое проксирование с помощью Apache?

То, что вы пытаетесь реализовать, - это официальный прокси-сервер SSL MITM («официальный», а не злоумышленник). Я не думаю, что Apache Httpd может это сделать (и повторно сгенерировать сертификат с правильным идентификатором на лету).

Есть продукты, которые это реализуют. Быстрый поиск приводит к этим ссылкам:

Я пришел к выводу, что это возможно, используя mod_rewrite и виртуальный хост, который служит обратным прокси. Соединение входит в прокси-сервер и перезаписывает URL-адрес виртуального хоста (на сервере B) + записывает исходный URL-адрес в заголовок HTTP. Виртуальный хост служит конечной точкой SSL и обратным прокси-сервером и пересылает незашифрованный запрос на сервер A (через устройство безопасности). Сервер A перезаписывает целевой URL-адрес на исходный и пересылает на него. Я попробую это сделать в следующие дни и сообщу вам, сработало ли это. Если нет, я расскажу об использовании для этого squid с sslbump.

Спасибо за ответ!