Luis Diaz scored the winning goal when these sides met two weeks ago and fired Porto into an early lead in this latest Group B encounter at San Siro.
Evanilson missed a glorious chance to double the Primeira Liga leaders' advantage and that proved costly when Chancel Mbemba comically found the back of his own net.
Marko Grujic was a late replacement for the injured Mateus Uribe's in Porto's line-up and the midfielder played a big part in the visitors' opener, dispossessing Ismael Bennacer and playing in Diaz, who calmly slid the ball past Ciprian Tatarusanu.
At five minutes and two seconds, that was the second-fastest goal Milan had conceded at home in the competition – after Jari Litmanen for Ajax in 1994 – and the hosts could only muster a saved Olivier Giroud attempt in response before half-time.
Porto went close to moving further in front when Pepe flicked on a free-kick and Evanilson clipped the top of the crossbar with a header from close range.
Six minutes after that squandered opportunity, Giroud's parried shot was turned back across the face of goal by substitute Pierre Kalulu and poked over the line by Porto defender Mbemba under no real pressure.
Zlatan Ibrahimovic was introduced from the bench and thought he had snatched a late winner, only for the offside flag to quickly go up as Stefano Pioli's men failed to find the winning goal they desperately required.