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 4.1.4) og startet den. Da det er et standalone Java program kræver det ikke installation, men skal blot hentes og pakkes ud. Den korrekte placering ville være /opt mappen, men det er op til dig. Du starter Charles proxy via charles scriptet i ~/bin mappen.

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

Jeg ved ikke om det er det samme på andre distros, men i Fedora kan du placere et start ikon  under Activities->Show applications ved at oprette en *.desktop fil (ikonet bliver tilgængeligt med det samme, ingen grund til at logge ud eller genstarte – i hvert fald på Fedora 26):

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

Blandt de linier der kommer frem, skulle du gerne se

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

Kig efter disse linier (kun et eksempel, adresserne kan variere)

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 7 telefon går jeg til Indstillinger -> Forbindelse -> Wi-Fi og hold fingeren på den aktuelt tilsluttede Wifi forbindelse indtil en menu kommer frem. Her vælger jeg “Administrer nertværksindstillinger”. Sæt flueben i “Vis avancerede indstillinger” og vælger “Manuelt” under “Proxy”.

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.

Nu skulle Charles Proxy gerne ret hurtigt bede dig godkende forbindelsen fra telefonen, ellers prøv at slukke/tænde telefonens Wi-Fi.

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:

Du kan evt. tjekke om porten allerede er åben:

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. Dette vil downloade getssl.crt til telefonen.

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”.  Klik på knappen “Add”. Nu skal du tilføje et nyt element under “Locations” og “Rules”:

Locations:

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

(Resten af felterne efterlades blanke)

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.