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

Stunnel: ssl в ssl

У меня есть небольшой сервис, который слушаю только на https: // localhost: 41952 и проверяет исходное имя хоста (оно должно быть localhost). Я хочу подключиться к "listen: 1988" и перенаправить запросы с помощью stunnel на "localhost: 41952"

https://192.168.1.10:1988 -> redirect https://localhost:41952

текущая конфигурация:

[myservice]
cert = stunnel.pem
accept = 0.0.0.0:1988
connect = localhost:41952

журнал openssl_client:

http://pastebin.com/7bg3sf7J

Обратите внимание, что этот сертификат отличается от сертификата на localhost: 41952.

локон тест:

$ curl https://192.168.1.17:1988/DYMO/DLS/Printing/Check -vk
*   Trying 192.168.1.17...
* Connected to 192.168.1.17 (192.168.1.17) port 1988 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate: localhost
> GET /DYMO/DLS/Printing/Check HTTP/1.1
> Host: 192.168.1.17:1988
> User-Agent: curl/7.43.0
> Accept: */*
> 

ждем вечно.

Может мне нужно client = yes? Но у меня нет сертификата, если только я не экспортировал его из Firefox на сайте сервиса. https: // локальный: 41952

Мой первоначальный вопрос:

Бесплатный обратный прокси с SSL для Windows

stunnel - это программа для создания шлюза между SSL и не SSL. Из описание на главной странице:

Stunnel - это прокси-сервер, предназначенный для добавления функциональности шифрования TLS к существующим клиентам и серверам без каких-либо изменений в коде программ.

Этот инструмент не предназначен для создания шлюза от SSL к SSL. В вашем случае вам понадобится простой перенаправитель TCP, который можно сделать с помощью сокат:

socat TCP4-LISTEN:1988,fork TCP4:127.0.0.1:41952

С этим сервером пересылки соединение с 192.168.1.17:1988 перенаправляется на 127.0.0.1:41952. Клиент получит исходный сертификат от сервера, потому что пересылка выполняется на уровне TCP. Сервер увидит соединение с 127.0.0.1.

РЕДАКТИРОВАТЬ: после большого количества сообщений теперь ясно, что цель состоит не в том, чтобы указать правильное имя исходного хоста es и в вопросе, а не в правильном Referer, как заявлено в ответе, а в том, что заголовок HTTP-запроса Host имеет ожидаемое значение localhost '. Поскольку заголовок хоста устанавливается из URL-адреса, вам необходимо убедиться, что запрос перенаправляется в удаленную систему, и браузер не пытается разрешить URL-адрес сам по себе, потому что в противном случае он попытается подключиться к серверу на машине, где браузер запущен. Чтобы отложить разрешение URL-адреса на целевую систему, вам нужно запустить там прокси, то есть что-то вроде Charles Proxy, который вы пробовали, или какой-нибудь прокси-сервер SOCKS.

Итак, чтобы подключиться к https://192.168.1.10:1988 и подключитесь к службе SSL, которая прослушивает порт 4952 интерфейса обратной связи на хосте с IP 192.168.1.10:

Нам нужно 2 stunnel строфы, чтобы достичь того, что мы хотим.

[myservice]
cert = stunnel.pem
client = no
accept = 0.0.0.0:1988
connect = localhost:1987

[myserviceaux]
cert = stunnel.pem
client = yes
accept = localhost:1987
connect = localhost:4952

Единственное, чего я не могу добиться, - это изменить host заголовка на localhost для всех запросов в stunnel.

Из curl он отлично работает:

$ curl https://192.168.1.10:41951/DYMO/DLS/Printing/Check -k -H "Host: localhost"

Я решил похожий HTTPS-TO-HTTPS проблема на Windows с помощью этой команды:

netsh interface portproxy add v4tov4 listenport=443 listenaddress=127.0.0.1 connectport=[remote-https-port] connectaddress=[remote-ip]