Apriamo l'interfaccia web del telefono e verifichiamo che il parametro TR069_Enable sia settato ad 1, se non lo fosse dovremmo abilitarlo, attenzione che telefoni con versioni molto vecchie del software, anche se hanno il parametro, non hanno implementato il protocollo.
Per iniziare a fare i primi test abbiamo bisogno di configuare la nostra distribuzione Linux. Come abbiamo già detto in precedenza avremmo bisogno di alcuni programmi, già abbiamo il dhcpd installato e funzionante. Ora procuriamoci un server DNS. Bind fa a al caso nostro. yum install bind
Bene, abbiamo un server DNS, ora dovremmo configurarlo. Se mettiamo in ascolto un tcpdump sull'interfaccia del telefono ci accorgiamo che interroga il DNS cercando di risolvere alcuni indirizzi. Se ricordate bene abbiamo configurato il nostro dhcpd in modo da settare sul telefono che il DNS siamo noi con il parametro option domain-name-servers 192.168.1.1; # me.
Osserviamo che il telefono cerca di risolvere i nomi: time.windows.com, che potremmo tranquillamente ignorare visto che servirà al telefono per sincronizzare il suo orologio e acs-mp315.urmet.it per i telefoni della Germania oppure regman-tl.interbusiness.it per i telefoni venduti da telecom italia. Verificate quale sia il vostro e configuriamo il DNS affinchè li risolva con il nostro indirizzo IP 192.168.1.1 .
Supponiamo abbiamo davanti un telefono italiano, editiamo il file /etc/named.rfc1912.zones inserendo le seguenti linee
zone "interbusiness.it" { type master; file "interbusiness_it.db"; allow-transfer { 192.168.1.1; }; };
Poi dovremmo creare il file /var/named/interbusiness_it.db con quanto segue
$TTL 86400 @ IN SOA interbusiness.it. root.interbusiness.it. ( 2008112400 ; Serial 28800 ; Refresh 7200 ; Retry 604800 ; Expire 86400 ) ; Minimum NS 192.168.1.1.
regman-tl 10800 IN A 192.168.1.1 ; me on eth1
Bene, il DNS è configurato. Ora possiamo lanciarlo con service named start
Il telefono al boot interroga il dhcp per ottenere il suo indirizzo IP e quello del DNS. L'indirizzo del DNS è ancora il nostro. Sul nostro computer abbiamo eseguito un server DNS per la risoluzione di regman-tl.interbusiness.it che sarà quello con cui il telefono scambierà informazioni. Abbiamo fatto in modo che anche questo indirizzo sia risolto con 192.168.1.1 tramite il DNS.
A questo punto il telefono effettua una richiesta, cerca di aprire una connessione all'indirizzo 192.168.1.1:443, è un tentativo di una connessione https. questo significa che la comunicazione tra il telefono e noi (in questo caso) sarà criptata. Non solo, se nell'apertura della connessione SSL viene richiesto che i certificati vengano firmati da una certification autority sarà un pò difficile far passare il nostro PC per il server che aggiorna i telefoni.
Mettiamo comunque un server web e configuriamolo con dei certificati ssl. Proviamo con certificati auto prodotti, senza nessuna CA che li valida. Ci sono molte guide on line che spiegano come configurare il tutto. Per questo non mi soffermerò molto su questa configurazione.
Generare la chiave privata openssl genrsa -des3 -out server.key 1024
Generare la CRC (Certificate Signing Request) openssl req -new -key server.key -out server.csr
Rimuovere la passfrase dalla chiave cp server.key server.key.org openssl rsa -in server.key.org -out server.key
Generazione di un certificato self-signed openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
installare la chiave privata e il certificato cp server.crt /etc/httpd/conf/ssl.crt cp server.key /etc/httpd/conf/ssl.key
Configurare ssl in Apache
SSLEngine on SSLCertificateFile /etc/httpd/conf/ssl.crt SSLCertificateKeyFile /etc/httpd/conf/ssl.key
Arrivati a questo punto con due righe di PHP possiamo vedere il primo messaggio che il telefono invia al server, che da adesso in poi chiameremo ACS, che si occuperà di comandare o meno il download della relase software.
Possiamo notare anche un'altra cosa. Il telefono si collega a noi chiedendo di essere autenticato tramite il metodo basic del protocollo http. Quindi ci invierà utente e password in chiaro che potremmo leggere rispettivamente nelle variabili $_SERVER['PHP_AUTH_USER'] e $_SERVER['PHP_AUTH_PW']. Nel mio caso sono 01UrmetTlc-MP-315-Test l'utente e U-a-tr069L19May03-049pdu la password. Non c'è bisogno di configurare il nostro web server per autenticare l'accesso del telefono che si presenti con quelle credenziali, basta abilitarlo a tutti, indipendentemente se chi si connette si autentica o meno.
Nella $HTTP_RAW_POST_DATA troviamo il messaggio XML che il telefono invia all'ACS. Posto il messaggio quì sotto.
111111 Urmet 00D01A MediaPhone_315 0001188900010900000aa 1BOOT 1 2000-01-01T03:12:01Z 0 Device.DeviceInfo.SpecVersion 1.0 Device.DeviceInfo.HardwareVersion 2.0.0 Device.DeviceInfo.SoftwareVersion 3.10.10 Device.DeviceInfo.ProvisioningCode Device.ManagementServer.ConnectionRequestURL http://192.168.1.2:8082/acscall/ Device.ManagementServer.ParameterKey Device.LAN.IPAddress 192.168.1.2 Device.GatewayInfo.ManufacturerOUI Device.GatewayInfo.ProductClass Device.GatewayInfo.SerialNumber Device.ManagementServer.UDPConnectionRequestAddress