У меня есть небольшая служба, которая слушает только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:
Обратите внимание, что этот сертификат отличается от сертификата на 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://localhost:41952
Мой изначальный вопрос:
решение1
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.
EDIT: после долгого общения теперь ясно, что цель состоит не в том, чтобы правильное имя исходного хоста было заявлено в вопросе и не в правильном Referer, как заявлено в ответе, а в том, чтобы заголовок HTTP-запроса Host имел ожидаемое значение 'localhost'. Поскольку заголовок хоста задается из URL, вам нужно убедиться, что запрос пересылается на удаленную систему, и браузер не пытается самостоятельно разрешить URL, потому что в противном случае он попытается подключиться к серверу на машине, где запущен браузер. Чтобы отложить разрешение URL на целевую систему, вам нужно запустить там прокси, то есть что-то вроде Charles Proxy, который вы пробовали, или какой-нибудь SOCKS-прокси.
решение2
Итак, чтобы подключиться кhttps://192.168.1.10:1988и достигаем службы SSL, которая прослушивает порт 4952 интерфейса loopback на хосте с IP 192.168.1.10:
Нам нужно 2 потрясающих строфы, чтобы достичь желаемого.
[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"
решение3
Я решил похожую HTTPS-TO-HTTPS
проблему наОкнас помощью этой команды:
netsh interface portproxy add v4tov4 listenport=443 listenaddress=127.0.0.1 connectport=[remote-https-port] connectaddress=[remote-ip]