Eu tenho um pequeno serviço que ouve apenashttps://localhost:41952e verifica o nome do host de origem (deve ser localhost). Quero me conectar em "listen:1988" e redirecionar solicitações com stunnel para "localhost:41952"
https://192.168.1.10:1988 -> redirect https://localhost:41952
configuração atual:
[myservice]
cert = stunnel.pem
accept = 0.0.0.0:1988
connect = localhost:41952
Registro openssl_client:
Observe que este certificado é diferente do localhost:41952.
teste de ondulação:
$ 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: */*
>
esperando para sempre.
Talvez eu precise client = yes
? Mas não tenho nenhum certificado, a não ser que exportei do Firefox no site do serviçohttps://localhost:41952
Minha pergunta original:
Responder1
stunnel é um programa para criar um gateway entre não-SSL e SSL. Dedescrição na página inicial:
Stunnel é um proxy projetado para adicionar funcionalidade de criptografia TLS a clientes e servidores existentes sem quaisquer alterações no código dos programas
Esta ferramenta não foi projetada para criar um gateway de SSL para SSL. O que você precisa no seu caso é apenas um simples encaminhador TCP que pode ser feito comsocat:
socat TCP4-LISTEN:1988,fork TCP4:127.0.0.1:41952
Com este encaminhador, a conexão para 192.168.1.17:1988 é encaminhada para 127.0.0.1:41952. O cliente obterá o certificado original do servidor porque o encaminhamento é feito no nível TCP. O servidor verá a conexão vindo de 127.0.0.1.
EDIT: depois de muita comunicação, agora está claro que o objetivo não é ter o nome de host de origem correto reivindicado e na pergunta e não o Referer correto conforme reivindicado em uma resposta, mas que o cabeçalho da solicitação HTTP do Host tenha o valor esperado 'localhost '. Como o cabeçalho do host é definido a partir da URL, você precisará garantir que a solicitação seja encaminhada para o sistema remoto e que o navegador não esteja tentando resolver a URL sozinho, caso contrário, ele tentaria se conectar ao servidor na máquina onde o navegador está em execução. Para adiar a resolução da URL para o sistema de destino, você precisa executar um proxy lá, ou seja, algo como o Charles Proxy que você tentou ou algum proxy SOCKS.
Responder2
Então, para se conectarhttps://192.168.1.10:1988e acesse o serviço SSL que escuta na porta 4952 da interface de loopback no host com IP 192.168.1.10:
Precisamos de 2 estrofes de stunnel para conseguir o que queremos.
[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
A única coisa que não consigo conseguir é modificar o host do cabeçalho para localhost para todas as solicitações no stunnel.
Do curl está funcionando perfeitamente:
$ curl https://192.168.1.10:41951/DYMO/DLS/Printing/Check -k -H "Host: localhost"
Responder3
Eu resolvi um HTTPS-TO-HTTPS
problema semelhante emjanelascom este comando:
netsh interface portproxy add v4tov4 listenport=443 listenaddress=127.0.0.1 connectport=[remote-https-port] connectaddress=[remote-ip]