Eu tenho tentado configurar o HTTPS com um projeto node.js no qual estou trabalhando. Segui essencialmente a documentação do node.js. para este exemplo:
// curl -k https://localhost:8000/
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
https.createServer(options, function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
Agora, quando eu faço
curl -k https://localhost:8000/
eu recebo
hello world
como esperado. Mas se eu fizer
curl -k http://localhost:8000/
eu recebo
curl: (52) Empty reply from server
Em retrospecto, parece óbvio que funcionaria dessa maneira, mas, ao mesmo tempo, as pessoas que eventualmente visitarem meu projeto não digitarão https : // yadayada, e eu quero que todo o tráfego seja https a partir do momento em que eles acessarem o site.
Como posso obter o nó (e o Express, como essa é a estrutura que estou usando) para entregar todo o tráfego de entrada para https, independentemente de ter sido especificado ou não? Não consegui encontrar nenhuma documentação que tratasse disso. Ou apenas assume-se que, em um ambiente de produção, o nó tem algo à sua frente (por exemplo, nginx) que lida com esse tipo de redirecionamento?
Esta é a minha primeira incursão no desenvolvimento web, então, perdoe minha ignorância se isso for algo óbvio.
Respostas:
Ryan, obrigado por me apontar na direção certa. Eu ampliei sua resposta (segundo parágrafo) um pouco com algum código e ele funciona. Nesse cenário, esses trechos de código são colocados no meu aplicativo expresso:
O servidor https express escuta o ATM em 3000. Eu configurei essas regras do iptables para que o nó não precise ser executado como root:
Todos juntos, isso funciona exatamente como eu queria.
fonte
Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects
if(!req.secure){}
if(req.protocol==='http')
declaraçãoSe você seguir as portas convencionais, já que o HTTP tenta a porta 80 por padrão e o HTTPS tenta a porta 443 por padrão, você pode simplesmente ter dois servidores na mesma máquina: Aqui está o código:
Teste com https:
Com http:
Mais detalhes: Nodejs HTTP e HTTPS na mesma porta
fonte
res.writeHead(301, etc.)
funcionará corretamente apenas para chamadas GET, pois301
não está dizendo ao cliente para usar o mesmo método. Se você quiser manter o método usado (e todos os outros parâmetros), precisará usarres.writeHead(307, etc.)
. E se ainda não funcionar, você pode precisar fazer proxy. Fonte: http://stackoverflow.com/a/17612942/1876359Graças a esse cara: https://www.tonyerwin.com/2014/09/redirecting-http-to-https-with-nodejs.html
fonte
app.enable('trust proxy');
app.get('X-Forwarded-Proto') != 'http'
em vez dereq.secure
aws.amazon.com/premiumsupport/knowledge-center/...Com o Nginx, você pode aproveitar o cabeçalho "x-forwarded-proto":
fonte
app.enable('trust proxy');
: "Indica que o aplicativo está protegido por um proxy frontal e usar os cabeçalhos X-Forwarded- * para determinar a conexão e o endereço IP do cliente." expressjs.com/en/4x/api.html#app.setA partir da versão 0.4.12, não havia uma maneira clara de escutar HTTP e HTTPS na mesma porta, usando os servidores HTTP / HTTPS do Node.
Algumas pessoas resolveram esse problema fazendo com que o servidor HTTPS do Node (que também funciona com o Express.js) ouça 443 (ou alguma outra porta) e também tenha um pequeno servidor http vinculado a 80 e redirecione os usuários para a porta segura.
Se você precisar absolutamente manipular os dois protocolos em uma única porta, precisará colocar nginx, lighttpd, apache ou algum outro servidor Web nessa porta e agir como um proxy reverso para o Node.
fonte
Você pode usar o módulo express-force-https :
npm install --save express-force-https
fonte
app
primeiro. (veja esta resposta )Uso a solução proposta pela Basarat, mas também preciso sobrescrever a porta, pois costumava ter 2 portas diferentes para os protocolos HTTP e HTTPS.
Também prefiro usar porta não padrão, para iniciar o nodejs sem privilégios de root. Eu gosto de 8080 e 8443 porque vim de muitos anos de programação no tomcat.
Meu arquivo completo se torna
Então eu uso o iptable para alterar o tráfego 80 e 443 nas minhas portas HTTP e HTTPS.
fonte
Esta resposta precisa ser atualizada para funcionar com o Express 4.0. Aqui está como eu consegui o servidor http separado para trabalhar:
fonte
Se seu aplicativo estiver protegido por um proxy confiável (por exemplo, um AWS ELB ou um nginx configurado corretamente), este código funcionará:
Notas:
fonte
Acho req.protocol funciona quando estou usando express (não testei sem, mas suspeito que funcione). usando o nó atual 0.10.22 com express 3.4.3
fonte
A maioria das respostas aqui sugere o uso do cabeçalho req.headers.host.
O cabeçalho do host é exigido pelo HTTP 1.1, mas é realmente opcional, pois o cabeçalho pode não ser realmente enviado por um cliente HTTP, e o node / express aceitará essa solicitação.
Você pode perguntar: qual cliente HTTP (por exemplo: navegador) pode enviar uma solicitação sem esse cabeçalho? O protocolo HTTP é muito trivial. Você pode criar uma solicitação HTTP em poucas linhas de código, para não enviar um cabeçalho de host e, sempre que receber uma solicitação malformada, você lançará uma exceção e, dependendo de como você lida com essas exceções, isso pode levar o seu servidor para baixo.
Portanto, sempre valide toda a entrada . Isso não é paranóia, recebi solicitações sem o cabeçalho do host no meu serviço.
Além disso, nunca trate URLs como strings . Use o módulo de URL do nó para modificar partes específicas de uma sequência. O tratamento de URLs como seqüências de caracteres pode ser explorado de várias maneiras. Não faça isso.
fonte
É isso que usamos e funciona muito bem!
fonte
você pode usar o módulo "net" para ouvir HTTP e HTTPS na mesma porta
fonte
Isso funcionou para mim:
fonte
Você pode instanciar 2 servidores Node.js - um para HTTP e HTTPS
Você também pode definir uma função de configuração que os dois servidores executarão, para que você não precise escrever muito código duplicado.
Aqui está a maneira como eu fiz isso: (usando restify.js, mas deve funcionar para express.js, ou o próprio nó também)
http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/
fonte
Isso funcionou para mim:
Recomende adicionar os cabeçalhos antes de redirecionar para https
Agora, quando você faz:
Você obtém:
Eu uso express 4.17.1
fonte