javascript node.js ssl nginx https

javascript - Configuración de HTTPS para Express y Nginx



node.js ssl (2)

Gracias a la solución @rsp, aquí está la configuración de trabajo de Nginx:

server { listen 80; listen 443 ssl; server_name fire.mydomain.me; ssl_certificate /etc/letsencrypt/live/fire.mydomain.me/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/fire.mydomain.me/privkey.pem; location / { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ''upgrade''; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }

Estoy tratando de configurar mi aplicación ExpressJS para la conexión https. El servidor Express se ejecuta en localhost: 8080 y el localhost seguro: 8443.

Aquí está el código server.js relacionado con https:

var app = express(); var https = require(''https''); const options = { cert: fs.readFileSync(''/etc/letsencrypt/live/fire.mydomain.me/fullchain.pem''), key: fs.readFileSync(''/etc/letsencrypt/live/fire.mydomain.me/privkey.pem'') }; app.listen(8080, console.log("Server running")); https.createServer(options, app).listen(8443, console.log("Secure server running on port 8443"));

Y aquí está mi configuración de Nginx:

server { listen 80; listen [::]:80; server_name fire.mydomain.me; location / { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ''upgrade''; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } server { listen 443; listen [::]:443; server_name fire.mydomain.me; location / { proxy_pass https://localhost:8443; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ''upgrade''; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }

Lo que hice :

  • Generando certificado SSL con la herramienta de certificación Letsencrypt para el dominio fire.mydomain.me.
  • Configurando nginx.
  • Configuración de la aplicación del nodo server.js.
  • Agregar reglas TCP para el puerto 443 en Ufw.

Lo intenté

  • Comentando la línea del servidor no ssl en server.js para forzar a las conexiones a pasar por la configuración ssl: esto sirve a la página cuando intento ir a fire.mydomain.me:443 pero no a "https: // fire.mydomain. yo". En ambos casos, no SSL. Intentando ir a https: // fire.mydomain.me genera este mensaje "Este sitio web no proporciona una conexión segura" en Google Chrome.

  • En primer lugar, seguí este tutorial para configurar mi configuración de nodo SSL: https://medium.com/@yash.kulshrestha/using-lets-encrypt-with-express-e069c7abe625#.93jgjlgsc


No necesita usar HTTPS entre su proxy inverso nginx y la aplicación Node que se ejecuta en el mismo host. Puede proxy tanto las solicitudes HTTP al puerto 80 como las solicitudes HTTPS al puerto 443 al mismo puerto en su aplicación Node, 8080 en este caso, y no necesita configurar certificados TLS en ese caso.

Puede cambiar su archivo server.js a:

var app = express(); app.listen(8080, console.log("Server running"));

y use una configuración nginx que tenga proxy_pass http://localhost:8080; tanto para HTTP en el puerto 80 como HTTPS en el puerto 443.

Así es como generalmente se hace. Cifrar el tráfico en la interfaz de bucle invertido no agrega ninguna seguridad porque para rastrear el tráfico necesita acceso raíz al cuadro y cuando lo tenga, puede leer los certificados y descifrar el tráfico de todos modos. Teniendo en cuenta el hecho de que la mayoría de las publicaciones en https://nodejs.org/en/blog/vulnerability/ están relacionadas con OpenSSL, se podría argumentar que el uso de SSL en Node puede hacerlo menos seguro en ese caso particular de cifrar el tráfico de la interfaz de bucle invertido . Vea esta discusión sobre el proyecto Node en GitHub para obtener más información.