geowe / RTCMapping

RealTime Collaborative Mapping
Apache License 2.0
8 stars 3 forks source link

navegación segura en la parte del servidor #57

Closed gentooza closed 3 years ago

gentooza commented 3 years ago

Hola!

Sería interesante poder activar https en la parte del servidor. se podría documentar como hacerlo? o modificar el código para su configuración?

un saludo!

(Editado) consigo que el servidor se ejecute creando un certificado autofirmado, y cambiando el código de index.js así:

var fs = require('fs');
var app = require('express')();
//var http = require('http').Server(app);

var privateKey  = fs.readFileSync('xxxxxxxxx/rtcm-server/mapeo.key', 'utf8');
var certificate = fs.readFileSync('xxxxxxxxxx/rtcm-server/mapeo.crt', 'utf8');

var certs = {key: privateKey, cert: certificate};
var http = require('https').createServer(certs, app);

var io = require('socket.io')(http);

pero creo que me falla la creación del proxy de apache :-/

i62lotor commented 3 years ago

Hola. Para pruebas podrías usar un certificado autofirmado, como indicas, pero cuando lo publiques para comunicar a los clientes, tendrás problemas de seguridad en los navegadores, y no funcionará. Esto se debe a las implementaciones de seguridad de los navegadores, al tratar con certificados autofirmados. Eso es lo que nos pasaba cuando implementamos/desplegamos bajo ssl. Por lo que en la demo lo dejamos sin ssl.

Para implementar el ssl puedes mirar en la documentación de socket.io. En la parte cliente sería simplemente cambiar la URL.

Un saludo

gentooza commented 3 years ago

aham,

la cosa es que hemos probado con un autofirmado porque los certificados que creamos con let's encrypt automáticamente, se crean con el usuario root, y al intentar leerlos en la aplicación servidor, daba fallo de permisos. :-/ le damos una vuelta y si conseguimos algo lo compartimos.

gracias!

i62lotor commented 3 years ago

Hola @gentooza

Seria estupendo que compartas tu experiencia. Creo que se puede generar certificados sin ser root. O intentar cambiar los permisos para que sean accesibles.

Además al habilitar https quedaría disponible la funcionalidad de geolocalización "Donde estoy" conjuntamente con la comunicación en tiempo real, al desplegar el cliente también bajo https.

gentooza commented 3 years ago

vale!

Es como dices, el problema era el certificado autofirmado.

  1. creo un certificado con let's encrypt lo único es que es del usuario root y con permisos imposibles para le usuario que ejecuta el servidor. (600)

  2. Lo preparamos copiamos su privkey y fullchain a la carpeta de la aplicación servidor de rtcmapping, y cambiamos el propietario al usuario que ejecuta la aplicación servidor.

  3. cambiamos el código de la aplicación servidor a este, donde cargamos el privkey y el fullchain.

    
    var fs = require('fs');
    var app = require('express')();
    //var http = require('http').Server(app);

var privateKey = fs.readFileSync('xxxxxxxxx/rtcm-server/privkey.pem', 'utf8'); var certificate = fs.readFileSync('xxxxxxxxxx/rtcm-server/fullchain.pem', 'utf8');

var certs = {key: privateKey, cert: certificate}; var http = require('https').createServer(certs, app);

var io = require('socket.io')(http);


4. modificamos aplicación cliente
en *src/org/geowe/rtcmapping/RealTimeEngine.js* cambiamos la URL de la función *connect* a usar https.
obligamos al alojamiento a redirigir el tráfico de la aplicación cliente a ser sólo https.

y está conectando y reconectando. Creo que va!
i62lotor commented 3 years ago

¡Estupendo! me alegro de que funcione. Cerramos este issue. Si te parece bien podemos, y gracias a lo bien que lo has detallado, podemos dejarlo documentado en un pequeño artículo en el blog de GeoWE. Por supuesto aparecerás como autor de la solución y enlazamos tu github.

Un saludo

gentooza commented 3 years ago

claro!

genial si es útil

un saludo!