Milan's newly crowned European footballer of the year Andriy Shevchenko struck the post in the 17th minute and with a minute remaining Andrea Pirlo fired just wide, while Juve created little.
Juve go into the Christmas break with 39 points while Milan have 35 and Udinese, who are at home to Lazio on Sunday, are third on 28.
On the basis of the chances created it was two points lost for Milan but coach Carlo Ancelotti chose to look on the positive side.
"Rather than being disappointed with the result I would say I am happy with our performance," said Ancelotti.
"Juventus are a team that concede very little and yet we were able to make chances for ourselves. The fact that we didn't take those opportunities is part of the game. It can happen and you have to accept that," added the Milan coach.
Ancelotti was forced into a late change when captain Paolo Maldini pulled out with a calf muscle injury and 38-year-old Alessandro Costacurta replaced him in the centre of defence and in the skipper's role.
The champions were the sharpest out of the blocks and went close in the fourth minute when Brazilian Kaka fed Shevchenko on the right and the Ukrainian fired in a low cross which Hernan Crespo was unable to connect with.
Shevchenko then beat Buffon, but not the post, with a firmly struck low drive from around 20 metres out as Juve struggled to cope with the visitors' speed and movement.
Argentine Crespo and Dutchman Clarence Seedorf both tested Juventus keeper Gianluigi Buffon while Juve's first effort on goal did not come until close to halftime when Gianluca Zambrotta's drive from the left was well dealt with by Dida.
Just before the whistle for the break Milan's Brazilian right back Cafu forced Buffon into action again with a fierce drive from a tight angle which the keeper parried.
ATTACKING PRESENCE
Juve lacked presence in attack and at halftime coach Fabio Capello opted to withdraw Alessandro Del Piero and throw on Uruguayan Marcelo Zalayeta.
The move made little difference to the pattern of the game though, with a couple of optimistic long-range efforts from Emerson and Pavel Nedved the most Juve could produce.
It was excellent defensive organisation from Juve, with Fabio Cannavaro in commanding form, which ensured that the ever-dangerous Kaka and Shevchenko were kept at bay.
In the final minute Milan almost snatched victory when Shevchenko slipped the ball to Pirlo on the left but the midfielder's shot beat the outside of Buffon's left-hand post.
Capello said Milan had been clearly the better side, especially during the first half.
"I'm satisfied with the result but not with the way we played. We gave them possession too easily and although we had chances to go at them on the break we couldn't make the most of such situations," he said.
"It wasn't a case of one or two players being to blame -- it was a general thing. Milan are in very good shape at the moment and we aren't at the peak of our condition," said Capello.
More from rediff