Прямой прокси-сервер Squid4 для обновления с ws на wss - PullRequest
0 голосов
/ 19 июня 2019

Squid4.6 используется в качестве прямого прокси для преобразования всего трафика в безопасный трафик.Конфигурация squid очень проста, он разрешает весь трафик и использует urlrewrite.pl для замены «http» на «https». (SSL-BUMP НЕ используется) Для прокси-сервера Squid установлено значение tls_outgoing_options, поэтому работает следующее:

клиент (http) -----> Squid ------> Сервер (https)

Теперь я пытаюсь повторить то же самое с помощью веб-сокетов.Есть 3 теста, 1. клиент (ws) ------> Squid -----> сервер (ws)

клиент (wss) ------> Squid -----> сервер (wss)

3 клиент (ws) ------> Squid ----> Сервер (wss)

Первые два случая работают с squid, но третий не работает.И мне нужен только третий вариант.
Я дал журналы отладки для urlrewrite.pl, чтобы показать точный запрос, полученный для подключения через веб-сокет, и следующий - это журнал: Здесь порт 8080: сервер и порт 3128: squid

DEBUG: root: localhost: 8080 127.0.0.1/localhost - CONNECT myip = 127.0.0.1 myport = 3128

Даже wireshark показывает то же самое, 1. CONNECT HTTP 1.1 2. GET 3.обновить протокол.

Вопрос: 1. Есть ли способ обновить соединение через веб-сокет для защиты веб-сокета с помощью squid4.6?2. Или, скажем, я использую wss-клиент (без сертификата) и wss-сервер (с сертификатами), есть ли способ сообщить squid использовать его собственные сертификаты, даже упомянутые в "tls_outgoing_options", для установления соединения?

ТРЕБУЕТСЯ: клиент всегда отправляет незащищенный трафик HTTP / WS, и Squid должен обновить его до HTTPS / WSS.В нашей настройке приложения мы используем наши собственные библиотеки openssl для создания сертификатов, которые не могут быть включены в пакет (client.go) go-tls, поэтому мы используем прокси-сервер squid для использования сертификатов, созданных нашими собственными библиотеками openssl.Client и Forward-Proxy (Squid) находятся в нашей специфической среде, поэтому squid.conf очень прост и допускает весь трафик.И нам нужна взаимная проверка подлинности.

SQUID CONF CODE

#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localhost src 127.0.0.1

acl SSL_ports port 443
acl Safe_ports port 443 # https
acl Safe_ports port 80  # http
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all

# Squid normally listens to port 3128
http_port 3128

url_rewrite_program /etc/squid/urlrewrite.pl
url_rewrite_access allow  all
tls_outgoing_options cert=/etc/squid/proxy.crt
tls_outgoing_options key=/etc/squid/proxy.key
tls_outgoing_options cafile=/etc/squid/serverauth.crt

urlrewrite CODE

#!/usr/bin/perl
select(STDOUT);
$| = 1;
while (<>) {
    #print STDOUT "OK rewrite-url=\"https://google.com\"\n";

    if (/^(|\d+\s+)((\w+):\/+)([^\/:]+)(|:(\d+))(|\/\S*)(|\s.*)$/) {
        my $channel = $1;
        my $protocolClean = $3;
        my $domain = $4;
        my $port = $5;
        my $portClean = $6;
        my $urlPath = $7;

    if ($protocolClean eq 'http' ){#&& ($port eq '' || $portClean eq '80')) {
           print STDOUT "${channel}OK rewrite-url=\"https://${domain}${port}${urlPath}\"\n";
       #print STDOUT "${channel}OK rewrite-url=\"https://google.com\"\n";
    } else {
           print STDOUT "${channel}ERR\n";
    }
    }
}
...