Milan had slightly more of the ball and created ten chances to Dortmund’s nine but were far less clinical.
Olivier Giroud had the opportunity to put Milan ahead in the 6th minute when they were awarded a penalty for handball. However, the Frenchman’s spot kick was too tame and easily saved by Gregor Kobel with a dive to his right.
Four minutes later, things went from bad to worse for Milan as Dortmund were awarded a penalty of their own after a clumsy Davide Calabria challenge on Jamie Bynoe-Gittens.
Marco Reus made no mistake from the spot, despite Milan goalkeeper Mike Maignan guessing the correct side.
Samuel Chukwueze equalised for Milan eight minutes before half time with an excellent solo goal, taking on two players on the right wing before cutting in and blasting past Kobel despite the tight angle.
Bynoe-Gittens put the visitors back in front in the 59th minute with a low shot into the bottom-left corner, finishing off a series of passes in and around the box.
Karim Adeyemi made it 3-1 for Dortmund ten minutes later with a shot from outside the box that looked to have been saved by Maignan, but indeed just crossed the line.
Milan’s last group stage match is against Newcastle United on December 14. If they are to progress to the round of 16, they not only need to win but must also have the other Group F match’s result go their way (Dortmund must beat PSG).
Should Milan win and PSG get a result in Germany, the Italian club will continue their European campaign in the Europa League.