Mehdi Taremi and Moussa Marega were on target for the Dragons before Federico Chiesa's late strike gave Andrea Pirlo's side a lifeline.
A woeful back pass from Rodrigo Bentancur allowed the hosts to steal an early lead. Marega doubled the advantage a few seconds into the restart after expertly getting past the Juventus defense.
The Bianconeri, who were frustrated by Porto's stoic defending all night, pulled one back through Chiesa, who thumped home an unstoppable effort in the 82nd minute.
The result gives Porto a crucial advantage ahead of the second leg of their Round of 16 fixture with Juventus in Turin.
Here are the Juventus player ratings from the encounter:
Juventus player ratings against Porto
Wojciech Szcznesy - 6/10
The Juventus custodian was let down by his own defense for the first goal. However, he could've done better against Marega in the build-up to the second goal.
Danilo - 6/10
The Brazilian showed minimal attacking threat and often looked unsettled in defense. He even picked up a yellow card, ruling him out of the decisive second leg at Turin.
Matthijs de Ligt - 6/10
The Dutchman was solid in defense but could have done more to prevent the second goal.
Giorgio Chiellini - 6/10
The Juventus veteran struggled to cope with Porto's high press. He saw his night cut short due to an apparent injury which forced him off after half an hour.
Alex Sandro - 5/10
Alex Sandro had a tough time dealing with Jesus Corona down his flank and struggled to help out offensively as well.
Federico Chiesa - 7/10
Federico Chiesa was anonymous for most of the game but salvaged some pride by netting a crucial away goal that reduced the deficit.
Rodrigo Bentancur - 5/10
Rodrigo Bentancur's woeful back-pass to Szczesny allowed Porto to grab an early lead. However, the Uruguayan managed to find his feet in the match eventually.
Adrien Rabiot - 6/10
Adrien Rabiot showed good attacking intent and provided the assist for Chiesa's goal.
Weston McKennie - 5/10
A lot was expected from Weston Mckennie on Wednesday but the American performed well below his standards.
Dejan Kulusevski - 6/10
There was not much to see from Dejan Kulusevski, who passed off as a bystander.
Cristiano Ronaldo - 6/10
This was not a memorable return to Portugal for Cristiano Ronaldo as he was kept firmly under wraps by Porto's stoic defense.
Alvaro Morata - 6/10
Alvaro Morata brought urgency to Juventus' attack with high-pressing and speed.
Aaron Ramsey - 5/10
The Welshman was largely quiet in the match after coming on.
Merih Demiral - 6/10
He replaced Chiellini in the first half and put in a decent performance.