Ecco il punto della situazione di oggi. Ho studiato (!) e mi sono documentato su nodejs.
Dopo avere installato nodejs, è incredibile notare come si possa costruire un server https
con pochissima fatica rispetto al codice C che ho sempre usato. Ecco il codice
$ cat basic.jsconst https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('miopriv.pem'),
cert: fs.readFileSync('miopub.pem')
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8443);
e redirigendo la porta esterna 8443 tramite port-forward sulla porta 8443 del mio pc locale
e poi facendo partire il server con
$ node basic.js,
effettivamente il comando
$ curl https://miodominio restituisce hello, world
(non uso curl -k perché voglio controllare se i certificati funzionano)
e se lo provo da un browser digitando
https://miodominio, il lucchetto si chiude.
BENE! ora devo solo trovare 2 cose:
1) come compilare i file coffee del tch.tar.gz senza modificare nulla (sto tentando di capire)
2) come inserire questa modifica nel tch e ricompilare senza errori.
#update di sabato:
la fase 1 è risolta, riesco a compilare la versione "standard"
ma non è stato per niente facile per via delle dipendenze
(e dei relativi conflitti) dei vari package coffeescript, pkg, npm.
Cmq è fatta. Nella cartella "release" ora ho le 3 versioni, linux, mac, win
Adesso la fase 2: modifica -- torno a studiare
aggiornamento.. penso di aver trovato il file da modificare
che sembra essere src/http/index.coffee ma essendo un coffeescript
che compila in nodejs, ha una sintassi diversa e fatico a trovare un modo
per passare il parametro delle chiavi pem a createServer
nuovo aggiornamento: sono riuscito a far funzionare le modifiche
usando la cartella dist dove ci sono tutti i nodejs ed evitandomi così
possibili errori se avessi toccato i coffeescript. Il server https sembra
funzionare,
(non capivo dove mettere le opzioni fin quando non ho esplicitato
alcune delle contorte funzioni-freccia, cioè le funzioni anonime con => )Adesso se non ci sono altri intoppi dovrei riuscire ad andare avanti,
anche se il server dhcp deve dare al modem l'ip locale 58.162.0.X,
ma gli passa l'opzione 43 specificando il mio nome di dominio:miaporta
mentre il server https(soap) ascolta sulla 58.162.0.1:miaporta
quindi ci sono altre piccole modifiche da fare, ma spero piccole!
lunedi sera:
le modifiche sembrano essere terminate... certo la procedura e' un po'
piu' laboriosa perche' si tratta di far partire il tch che trova già il pc con ip
statico 58.162.0.1, far assegnare al DGA4331 l'ip staccando internet (altrimenti
cicla tra DHCPDISCOVER e DHCPOFFER). Quando vedo il DHCPACK
abilito la condivisione windows, che condivide la 58.162.0.1 senza
cambiargli ip. Pero' il programma non logga nessun pacchetto SOAP.
Quello che ho provato a fare e' stato un
$ curl -X POST https://miodominio:8443 o
$ curl -X POST 58.162.0.1:8443
( grazie al port forward i due curl sono equivalenti)
la risposta sulla finestra del tch è stata questa (in colore verde)
[
404,
{
'Content-Type': 'text/xml; charset="utf-8"',
Server: 'ACSServer',
SOAPServer: 'ACSServer'
},
null
]
la modifica al file http/index.js è banale, serve solo per attivare il server https.
createServer = require('https').createServer; //Cambio in https
e piu sotto
myfs = require('fs'); // necessario per leggere dal filesystem
const options = {
key: myfs.readFileSync('miopriv.pem'), //la chiave privata
cert: myfs.readFileSync('miopub.pem') //la chiave pubblica
};
srv = createServer(options,route); //ho incluso l'opzione chiavi
srv.keepAliveTimeout = 30000;
invece la modifica al file principale index.js è stata questa:
if (args.tftp) {
servers.push.apply(servers, tftp(args));
} else if (args.dhcponly) {
servers.push(dhcpd(ip, args.acsurl, args.acspass));
} else {
ask(ip).then(port).then(function(p) {
var u, url;
p=8443; //Settato porta fissa
console.log("PORT",p);
u = new URL(args.acsurl || ("https://" + ip)); //Diventa https
u.port = p;
url = u.toString();
console.log("listening for cwmp requests at " + url);
//servers.push(dhcpd(ip, url, args.acspass));
servers.push(dhcpd(ip,'https://miodominio:8443', args.acspass));
console.log("http-url=",url);
return servers.push(httpd(ip, p, url));
});
}
Sono parecchio fuso.. la modifica del nodejs mi ha stancato.
Però sento che ci sono vicino ma non riesco a capire dove sbaglio...
Aggiornamento di mercoledì:
Penso di aver trovato la causa del problema. Ora vi spiego.
Io ho due connessioni di rete, una verso il modem vecchio, che mi da internet,
e una con vlan-id verso il DGA4331. Tutto sembrava funzionare ma l'opzione
43 non arrivava al modem, via programma tch modificato.
Allora ho tirato via il VLAN ID e ho connesso il mio fido portatile di test
al posto del modem e mi sono accorto del problema.
Io tenevo pronta la connessione sul modem vecchio, condivisa ma disabilitata
fino a che non ottenevo il DHCPACK del modem all'IP fornito dal TCH,
ma la rete 58.0.1.X disabilitata, essendo condivisa, NON DISABILITA IL DHCP di ICS
(Windows internet connection sharing)
e quindi il DHCP di ICS, nonostante la rete disattivata,
assegnava comunque al DGA4331 un IP sulla sottorete 58.162.0.X
ed essendo questo DHCP server più veloce di quello sul programma TCH, vinceva lui
Quindi il modem si trova ad avere un IP connesso, ma diverso da quello sul quale
il DHCP del TCH avrebbe dovuto mandare l'opzione 43, ma tale IP non veniva assegnato.
Adesso ho due strade:
1) riesco a disabilitare completamente solo il server DHCP di Windows ICS (difficile)
oppure
2) attivo PRIMA la rete 192.168.1.X del modem vecchio che porta internet, senza condivisioni
e POI la condivido sulla rete 58.162.0.X sperando che, attivandosi pure il DHCP di ICS,
il DGA4331 - che ha già ricevuto l'IP dal programma TCH - non lo cambi più.
Vi terrò aggiornati...