Charles Proxy – din mand i midten

Opgaven

På jobbet står jeg for et api som benyttes af en app til iPhone/Android. App’en udvikles af en leverandør, og jeg har derfor ikke nem adgang til at ændre url’en der naturligvis peger på vores produktionsmiljø. Når jeg skal teste ændringer, mangler jeg derfor en hurtig metode til at “pege” app’en over på udviklingsmiljøet.

Kort sagt: app’en “snakker” med prod.domæne.dk og det skal ændres midlertidigt til test.domæne.dk.

Det er nemt med en traditionel hjemmeside der tilgås via browseren på en computer, for her kan man bare rette i sin /etc/hosts fil. Men på tabletter og mobiler har producenten ofte gjort den slags ret umuligt. Så medmindre du er villig til at jailbreake din device, har du brug for en proxy.

Værktøjet

Der er flere gode bud, f.eks. Wireshark  som er gratis og helt fantastisk analyseværktøj hvis man virkelig skal i dybden med analyse af netværksdata. Til mit behov er det dog lidt som at bruge mikroskop, hvis et forstørrelsesglas kan klare opgaven.

Valget er derfor faldet på Charles Proxy der ligesom Wireshark både er tilgængelig til Windows, Mac og Linux. Sidstnævnte er mit foretrukne OS. Charles Proxy koster dog i skrivende stund $50 for en enkeltlicens. Det vil nogen nok rynke på næsen af. Men jeg kan godt lide programmets enkelthed og har absolut intet imod at betale for et stykke software. Den kan iøvrigt afprøves gratis i 30 dage.

En proxy lægger sig imellem afsender og modtager af data – i dette tilfælde mellem min mobil og min wifi forbindelse. Da proxy’en således både kan se og røre ved alt hvad min mobil kommunikerer med Internet, er det enkelt at ændre data og dirigere det et andet sted hen. Mulighederne er mange.

Bemærk: Løsningen beskrevet her, kræver at både computer og mobil benytter samme wifi forbindelse.

Opsætning af Charles Proxy (på Linux)

Jeg har hentet Charles Proxy (version 3.11.2) og startet den. Da det er et standalone Java program kræver det ikke installation, men skal blot hentes, pakkes ud og startes via scriptet i ~/bin mappen.

$ ./charles

Bemærk, jeg starter den som almindelig bruger, ikke root.

Charles Proxy lytter som standard på port 8888, og du kan tjekke at det rent faktisk er tilfældet:

$ netstat -tulpn

Blandt de linier der kommer frem, skulle du gerne se

tcp6 0 0 :::8888 :::* LISTEN 16424/java

Og nu skal du så lige notere dig adressen på den computer hvor proxien kører

$ ifconfig

inet 192.168.1.117  netmask 255.255.255.0  broadcast 192.168.1.255

Nu skal du så fortælle din device (mobil, tablet m.v.) at trafikken skal gennem denne proxy

Opsætning af tablet/mobil

På min Android telefon går jeg til Indstillinger -> Wifi og holder fingeren på den aktuelt tilsluttede Wifi forbindelse indtil en menu kommer frem. Her vælger jeg “Modificer netværkskonfig.”. Sæt flueben i “Vis avancerede indstillinger”. Du skal muligvis scrolle lidt for at se dem.

På iOS går du til “Indstillinger” -> Wifi og klikker på info ikonet (et “i” med en cirkel omkring) ud for den aktuelt tilsluttede wifi forbindelse. Scroll ned til Proxy indstillingerne nederst på siden:

Proxy: Manuel
Navn på Proxy-vært: 192.168.1.117
Proxy-port: 8888

(På Android: Husk at trykke på GEM nederst i dialogboksen)

Ip adressen skal du naturligvis erstatte med din egen fundet vha. ifconfig kommandoen.

Herefter slukker og tænder du for Wifi på telefonen.

Hvis du har en firewall

Hvis der er firewall på den computer hvor Charles Proxy kører, kan den spærre for adgangen til porten som Charles lytter på og så kan din mobil/tablet ikke forbinde. På min laptop er det firewalld og jeg kunne derfor åbne for porten således:

$ sudo firewall-cmd –permanent –zone=public –add-port=8888/tcp
$ sudo firewall-cmd –reload

Charles Proxy SSL opsætning

Rigtig meget kommunikation i dag, sker over SSL forbindelser (https). Det betyder at alt hvad der sendes frem og tilbage mellem device og Internet er krypteret. Hvis du vil kunne læse disse data, skal både device og computer indlæse Charles SSL cerficatet.

I Charles Proxy programmet: Help -> SSL Proxying -> Install Charles Root Certificate. Et vindue åbner, her trykker du på knappen [Import].

På dine devices åbnes en browser du besøger så blot internet adressen charlesproxy.com/getssl

Charles Proxy, ændring af host

Og nu til kernen i hele dette setup. Jeg vil gerne have en app til at kommunikere med et andet domæne. Lad os antage at den normalt taler med prod.domæne.dk men skal peges over på test.domæne.dk.

I Charles vælger du Tools -> Rewrite og sætter flueben i “Enable rewrite”. Nu skal du tilføje et nyt element under “Locations” og “Rules”:

Locations:

Protocol: https
Host: prod.domæne.dk

Rules:

Type: Host
Match -> Value: prod.domæne.dk
Replace -> Value: test.domæne.dk

… og til sidst:

Apply -> Ok

Hver gang din device sender noget afsted, vil disse data indholde navnet på destinationsserveren, som her er prod.domæne.dk. Men vores lille rewrite her, vil nu ændre i data som derfor i stedet sendes til test.domæne.dk

Konklusion

Dybest set handler det om at sætte “en mand i midten” der overvåger al kommunikation, og om nødvendigt kan redigere i data. Det er et fantastisk værktøj der giver en vifte af muligheder for at teste og afprøve forskellige scenarier. I en browser kan man i adresselinien se hvem man kommunikerer med og hvilke data der sendes. Den mulighed findes ikke i app’s, og derfor er værktøjer som “Charles Proxy” meget praktiske at have ved hånden… også hvis du bare er nysgerrig på hvad en app foretager sig.

Ovenstående er et “hint” mere end en egentlig vejledning. Hvis du vil vide mere om Charles Proxy henvises til Charles Proxy dokumentationen eller nogle af de mange eksempler man kan Google sig til.