Portugal hade inför matchen två kryss och låg fyra i tabellen samtidigt som ett Ukraina dragit i väg fullständigt med tretton inspelade poäng efter lördagens seger med 3-0 borta mot Litauen.
Det ska dock sägas att Portugal bara spelat två matcher, minst av alla i gruppen och vid seger skulle man också gå om motståndaren Serbien och Luxemburg på andra plats.
Portugal inledde bäst och det var tydligt att Nations League- och regerande Europamästaren var i kraftigt behov av en seger. Serbien fick inrikta sig på försvarsspel och försöka utnyttja misstag från gästerna.
Men en slutprodukt saknades hos Portugal vilket gjorde att den där riktiga målchansen inte kommit efter 20 spelade minuter. Serbien försvarade sig också bra och var kompakta bakåt.
Efter nära 30 minuter spelade kom den hittills hetaste chansen. Portugal bjöd på ett fint anfall och bollen nådde fram till Ronaldo i straffområdet. Men Juventus-anfallaren fick inte till sitt avslut, i sekvensen efter fick han en ny chans, men då i offsideposition.
Serbien var långt ifrån ofarliga och fick en bra möjlighet då Aleksandar Kolarov följde med offensivt från sin vänsterbacksposition. 33-åringen tvingades avsluta med fel fot och skottet gick utanför Rui Patricios stolpe.
I 42:a minuten slogs bollen in i Serbiens straffområde. Målvakten Dmitrovic stod för ett tveksamt agerande då han krockade in i försvararen Nikola Milenković och bollen landade framför William Carvalhos fötter. Portugisen kunde enkelt slå in 1-0-ledning för bortalaget.
I början av andra halvlek fälldes Ronaldo utanför straffområdet, föga förvånande tog han själv hand om frisparken. 34-åringen stegade traditionenligt upp och avslutade, skottet gick någon centimeter utanför höger stolpe.
Serbien försökte sticka upp och skapa möjligheter. Nytt mål skulle komma, återigen för gästerna i 58:e minuten. Denna gång genom Gonçalo Guedes som stod för en soloprestation och avslutade med vänsterfoten, ett hårt skott som Dmitrovic inte kunde stoppa.
Reduceringen skulle komma, Milenković som var inblandad i Portugals första mål fick revanschera sig. Han nådde högst på hörna och nickade resolut in bollen.
Efter målet försökte Serbien jaga kvittering och var nära ett par gånger. Det skulle bli en exploderande avslutning på matchen. Först trodde Ronaldo att han punkterat matchen i den 80:e minuten med sitt 3-1 mål, vackert framspelad av Bernardo Silva.
Glädjen blev kortvarig då Aleksandar Mitrović gjorde 3-2. Men minuten senare kom Portugal på nytt i ett anfall, denna gång placerade Silva in 4-2 vid högra stolpen.
- Vi behövde alla mål, inte bara mitt. Vi började matchen bra men sedan fick vi problem. Vi gjorde några misstag men matchen var bra. Det finns inga lätta matcher och vi vill toppa gruppen men först måste vi vinna mot Litauen, säger Bernardo Silva efter matchen.
Det blev matchens sista mål och Portugal tog en viktig skalp, tre poäng och upp på andra plats i tabellen.
- Serbien förvånade mig eftersom jag trodde att de skulle spela mer offensivt och sikta mot seger från första minuten men de spelade på samma sätt som de gjorde i Lissabon. Det gjorde det svårt för oss att skapa chanser men vi dominerade ändå och jag vill gratulera mina spelare för en välförtjänt vinst, sa Portugals tränare Fernando Santos efter matchen.
Startelvor:
Serbien: Dmitrovic - Milenkovic, Maksimovic, Nastasic, Kolarov - Matic, Milivojevic - Lazovic, Tadic, Kastic - Mitrovic
Portugal: Rui Patricio - Semedo, Fonte, Dias, Guerreiro - Danilo, William Carvalho, Bruno Fernandes - Ronaldo, Guedes, Bernardo Silva.