Sérgio Conceição's side struck in the opening minutes of either half to take a lead to Turin.
Article top media content
Porto scored at the start of both halves but Juventus kept this round of 16 tie in the balance thanks to Federico Chiesa's late reply.Porto vs Juventus: match as it happened, reaction
Match in brief
Porto hit the front after just 60 seconds when Rodrigo Bentancur's back-pass was too short and Mehdi Taremi's challenge on Wojciech Szczęsny sent the ball into the net. Juventus offered little before the break – their first attempt on goal came from Merih Demiral, on for the injured Giorgio Chiellini, in the 40th minute.
The visitors were slow out of the blocks too in the second period as Moussa Marega collected Wilson Manafá's cut-back and fired inside Szczęsny's near post after 19 seconds.
That finally seemed to spark Juventus but Porto, seeking a sixth consecutive clean sheet in the competition, remained resilient until Adrien Rabiot's cross was expertly turned in by Chiesa to leave this contest tantalisingly poised.
Player of the Match: Sérgio Oliveira (Porto)
"He maintained a great defensive shape and created real threat with his forward play and accurate set-piece delivery. A very energetic performance full of quality and know-how. He was quick to get the team organised and stop any threatening link-ups by Juventus."
Roberto Martínez, UEFA Technical Observer
Carlos Machado, Porto reporter
It was a bittersweet win for Porto after they controlled the game, had chances to score a third but ended up conceding a late goal to Chiesa. The hosts' game plan went as they had hoped as they prevented Juventus from creating dangerous situations for most of the match. Sérgio Oliveira had a big opportunity for the third that could have killed the tie but it was Chiesa's goal that has brought Juve right back into it.
Paolo Menicucci, Juventus reporter
"To err is human, but to persist (in the mistake) is diabolical," philosopher Seneca is often quoted as saying. After gifting Porto an early goal, Juventus repeated the same mistake after the interval. Apart from those two incidents, however, it seemed a night to forget for Juve, who lacked energy and ideas for most of the match and failed to create serious opportunities to score or to involve Ronaldo in attack. Chiesa's late strike, however, renews Bianconeri hopes ahead of the return leg in Turin.
Sérgio Conceição, Porto coach: "We didn't score by chance. Our pressure worked. The players perfectly interpreted what we wanted. We have always remained very organised, whether in a higher block or a lower block. The players gave a fantastic performance. Congratulations to them – they were the great architects of this win."
Agustín Marchesín, Porto defender: "Very happy with the team's work. We showed that we are a great team, that they have to respect us and that no one can underestimate us. Today we showed that we are here to do big things. We know that we faced a great opponent."
Andrea Pirlo, Juventus coach: "Porto have often played like that in the Champions League but we allowed them to play the way they wanted. We had to move the ball quicker and better. Porto were closing spaces in the middle and we had to use the flanks more. It's not easy, however, when the ball does not move quickly enough."
Danilo, Juventus defender: "This is the Champions League and we knew it was going to be a very difficult game against a team who prepare for this kind of game very well, so we knew we could not afford to make the mistakes we made tonight. Porto played as we expected but we have to know that you have to be ready from the start at this level."
• Marega (eight) overtook Frédéric Kanouté (seven) as the highest-scoring Malian in the UEFA Champions League.
• Taremi became the fifth Iranian player to score in the UEFA Champions League and the first in the knockout stage.
• Taremi's goal was the 200th Juventus have conceded in the UEFA Champions League era.
• Porto have scored at least one first-half goal in 28 of their 34 games this season.
• Porto had scored more than one goal in only one of their last 13 knockout phase matches in UEFA competition before this game.
• Juventus had conceded more than one goal in just one of their last 13 UEFA Champions League matches before tonight.
Porto: Marchesín; Manafá, Pepe, Mbemba, Zaidu; Corona (Loum 90), Sérgio Oliveira (Conceição 90), Uribe, Otávio (Luis Díaz 57); Marega (Grujić 66), Taremi
Juventus: Szczęsny; Danilo, De Ligt, Chiellini (Merih Demiral 35), Alex Sandro; Chiesa, Rabiot, Bentancur, McKennie (Morata 63); Kulusevski (Ramsey 77), Ronaldo
Both teams have a number of domestic fixtures prior to the second leg on Tuesday 9 March.
22/2: Marítimo (a)
27/2: Sporting (h)
03/3: Braga (h), Portuguese Cup
07/3: Gil Vicente (a)
22/2: Crotone (h)
27/2: Verona (a)
02/3: Spezia (h)
06/3: Lazio (h)
*League fixtures unless otherwise stated