The Serie A giants needed a point to ensure second place in Group H ahead of Frank de Boer's Ajax, and they started brightly in their pursuit of the victory that would rubber-stamp their progress.
However, Riccardo Montolivo's early dismissal left the Rossoneri playing at a disadvantage for over 68 minutes and goalkeeper Christian Abbiati had to draw on all his European experience to keep the desperate Dutch side at bay.
It would be an especially bad tempered first half in Milan and Christian Poulsen was quick to let Montolivo know he was there.
The resulting free-kick saw Mario Balotelli test Jasper Cillessen from 25 yards and suddenly the game sparked into life.
Poulsen hit a post in the fifth minute as Lasse Schone's corner swung wildly into the Milan box and Cristian Zapata was soon up the other end to blast against the covering Stefano Denswil.
Ajax earned another free-kick in the eighth minute and Poulsen once again connected with Schone's delivery to head just wide of the mark.
Abbiati kept Milan alive with a finger-tip save on Davy Klaasen's bullet header but Montolivo was not so considerate to his team-mates in the 22nd minute.
The over-zealous midfielder reignited his feud with Poulsen in the middle of the San Siro pitch and saw red for his troubles.
Milan were suddenly stricken with fear and retreated into their shells to defend the half out until they could devise a new game plan at the break.
Schone would breach their walls before the half-time whistle, drilling towards goal from 20 yards, but Abbiati was untroubled.
Milan's aggressor-in-chief Poulsen was withdrawn for the second half, which began with an unsuccessful sighter from Viktor Fischer. The Danish winger soon tried again but was blocked by Daniele Bonera.
Klaasen brought a good save from Abbiati before the hour, and a much better one 10 minutes later, but by this point it looked as if the Rossoneri were content to sit on the point that would be enough to see them reach the last 16.
If that plan was to work then they would need their goalkeeper to stay focused and he obliged, twice shepherding the tricky Fischer out of decent shooting positions.
A rare foray forward from a shy Milan side saw Kevin Constant shoot wildly over the bar but it was Ajax who came closest to snatching a late winner.
Daley Blind twice went close to breaking Abbiati's resolve and substitute Mike van der Hoorn missed a gilt-edged chance to nod home a header deep into stoppage time.
Milan finished second to Barcelona and can expect a tricky tie against the likes of Bayern Munich or Real Madrid, while Ajax dropped into the Europa League.