He estado tratando de configurar HTTPS con un proyecto node.js en el que estoy trabajando. Básicamente, he seguido la documentación de node.js para este ejemplo:
// 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);
Ahora cuando lo hago
curl -k https://localhost:8000/
yo obtengo
hello world
como se esperaba. Pero si lo hago
curl -k http://localhost:8000/
yo obtengo
curl: (52) Empty reply from server
En retrospectiva, esto parece obvio que funcionaría de esta manera, pero al mismo tiempo, las personas que eventualmente visiten mi proyecto no escribirán https : // yadayada, y quiero que todo el tráfico sea https desde el momento en que llegan. el sitio.
¿Cómo puedo obtener el nodo (y Express, ya que es el marco que estoy usando) para transferir todo el tráfico entrante a https, independientemente de si se especificó o no? No he podido encontrar ninguna documentación que aborde esto. ¿O simplemente se supone que en un entorno de producción, el nodo tiene algo que se encuentra frente a él (por ejemplo, nginx) que maneja este tipo de redirección?
Esta es mi primera incursión en el desarrollo web, así que perdona mi ignorancia si esto es algo obvio.
Respuestas:
Ryan, gracias por señalarme en la dirección correcta. Desarrollé su respuesta (segundo párrafo) un poco con algo de código y funciona. En este escenario, estos fragmentos de código se colocan en mi aplicación express:
El servidor https express escucha ATM en 3000. Configuré estas reglas de iptables para que el nodo no tenga que ejecutarse como root:
En conjunto, esto funciona exactamente como yo quería.
fuente
Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects
if(!req.secure){}
if(req.protocol==='http')
declaraciónSi sigue los puertos convencionales ya que HTTP intenta el puerto 80 de forma predeterminada y HTTPS prueba el puerto 443 de manera predeterminada, simplemente puede tener dos servidores en la misma máquina: Aquí está el código:
Prueba con https:
Con http:
Más detalles: Nodejs HTTP y HTTPS sobre el mismo puerto
fuente
res.writeHead(301, etc.)
solo funcionará correctamente para llamadas GET, ya301
que no le dice al cliente que use el mismo método. Si desea mantener el método utilizado (y todos los demás parámetros), debe utilizarlores.writeHead(307, etc.)
. Y si todavía no funciona, podría tener que hacer un proxy. Fuente: http://stackoverflow.com/a/17612942/1876359Gracias a este chico: https://www.tonyerwin.com/2014/09/redirecting-http-to-https-with-nodejs.html
fuente
app.enable('trust proxy');
app.get('X-Forwarded-Proto') != 'http'
lugar dereq.secure
aws.amazon.com/premiumsupport/knowledge-center/…Con Nginx puede aprovechar el encabezado "x-forwards-proto":
fuente
app.enable('trust proxy');
: "Indica que la aplicación está detrás de un proxy frontal y usar los encabezados X-Forward- * para determinar la conexión y la dirección IP del cliente". expressjs.com/en/4x/api.html#app.setA partir de 0.4.12 no tenemos una forma limpia de escuchar HTTP y HTTPS en el mismo puerto utilizando los servidores HTTP / HTTPS de Node.
Algunas personas han resuelto este problema haciendo que el servidor HTTPS de Node (esto también funciona con Express.js) escuche 443 (o algún otro puerto) y también tenga un pequeño servidor http vinculado a 80 y redirija a los usuarios al puerto seguro.
Si absolutamente tiene que ser capaz de manejar ambos protocolos en un solo puerto, entonces necesita poner nginx, lighttpd, apache o algún otro servidor web en ese puerto y actuar como un proxy inverso para Node.
fuente
Puede usar el módulo express-force-https :
npm install --save express-force-https
fuente
app
primero debe adjuntar cualquier middleware de redireccionamiento . (vea esta respuesta )Uso la solución propuesta por Basarat pero también necesito sobrescribir el puerto porque solía tener 2 puertos diferentes para los protocolos HTTP y HTTPS.
Prefiero también usar un puerto no estándar para iniciar nodejs sin privilegios de root. Me gustan 8080 y 8443 porque vengo de muchos años de programación en tomcat.
Mi archivo completo se convierte
Luego uso iptable para redactar tráfico 80 y 443 en mis puertos HTTP y HTTPS.
fuente
Esta respuesta debe actualizarse para funcionar con Express 4.0. Así es como conseguí que el servidor http por separado funcionara:
fuente
Si su aplicación está detrás de un proxy de confianza (por ejemplo, un AWS ELB o un nginx configurado correctamente), este código debería funcionar:
Notas:
fuente
Encuentro que req.protocol funciona cuando estoy usando express (no lo he probado sin, pero sospecho que funciona). utilizando el nodo actual 0.10.22 con express 3.4.3
fuente
La mayoría de las respuestas aquí sugieren usar el encabezado req.headers.host.
HTTP 1.1 requiere el encabezado Host, pero en realidad es opcional, ya que el encabezado podría no ser enviado por un cliente HTTP, y node / express aceptará esta solicitud.
Puede preguntar: ¿qué cliente HTTP (por ejemplo: navegador) puede enviar una solicitud que falta ese encabezado? El protocolo HTTP es muy trivial. Puede crear una solicitud HTTP en pocas líneas de código, para no enviar un encabezado de host, y si cada vez que recibe una solicitud con formato incorrecto, arroja una excepción, y dependiendo de cómo maneje dichas excepciones, esto puede hacer que su servidor caiga.
Por lo tanto, siempre valide todas las entradas . Esto no es paranoia, he recibido solicitudes que carecen del encabezado del host en mi servicio.
Además, nunca trate las URL como cadenas . Use el módulo URL del nodo para modificar partes específicas de una cadena. Tratar las URL como cadenas se puede explotar de muchas, muchas maneras. No lo hagas
fuente
¡Esto es lo que usamos y funciona muy bien!
fuente
puede usar el módulo "net" para escuchar HTTP y HTTPS en el mismo puerto
fuente
Esto funcionó para mí:
fuente
Puede crear instancias de 2 servidores Node.js, uno para HTTP y HTTPS
También puede definir una función de configuración que ejecutarán ambos servidores, para que no tenga que escribir mucho código duplicado.
Esta es la forma en que lo hice: (usando restify.js, pero debería funcionar para express.js, o el nodo en sí mismo)
http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/
fuente
Esto funcionó para mí:
Recomendamos agregar los encabezados antes de redirigir a https
Ahora, cuando lo haces:
Usted obtiene:
Yo uso express 4.17.1
fuente