Lucas Vazquez grabbed the winner nine minutes from time for the European champions, who were already guaranteed to go through to the last 16 as runners-up in Group H to Tottenham Hotspur.
Ronaldo took his tally to nine goals in six Europan appearances this season with a spectacular long-range effort into the top corner after Borja Mayoral's opener to give Real a 2-0 lead inside 12 minutes.
Benzema believes his World Cup dream is over
Pierre-Emerick Aubameyang continued his excellent record against Madrid with a quickfire double either side of half-time to bring Dortmund level.
But despite Vazquez's late strike, the Germans drop into the Europa League with a record low two points thanks to their better goal difference over APOEL Nicosia, who were defeated 3-0 at Spurs.
Real were, though, hit by a fresh injury blow as French international defender Raphael Varane limped off just before half-time holding his left leg.
Ronaldo’s brace helps Real cement last 16 spot
Zinedine Zidane now faces a defensive crisis ahead of the visit of Sevilla on Saturday with captain Sergio Ramos, right-back Dani Carvajal and holding midfielder Casemiro all suspended.
"With Rafa he has done some damage to himself, but we will see tomorrow when we do the scans as always," said Zidane. "He won't be there Saturday that is for sure. We have to look for solutions."
Zidane made six changes from the side that started Saturday's 0-0 draw at Athletic Bilbao, but the hosts still made a flying start.
Ronaldo's fine through ball just evaded Isco, but fell perfectly into the path of Mayoral and the 20-year-old kept his cool to chip the onrushing Roman Burki for his first Champions League goal.
By contrast, Ronaldo had his 114th in the competition moments later as he lined up a sumptuous strike from 25 yards.
However, the warning signs of a Dortmund recovery were in evidence as the first half wore on as Varane had to make last-ditch challenges to deny Aubameyang and Shinji Kagawa.
Aubameyang has spoken openly of his desire to play for Madrid one day and did his case of a dream move no harm with two classy finishes either side of half-time.
Once Varane limped off, Aubameyang was left free inside the box to plant a diving header inside the far corner two minutes before half-time.
And just four minutes after the break Dortmund were level as Aubameyang dinked a lovely finish over Keylor Navas after his initial effort had been saved by the Madrid goalkeeper for his fifth goal in his last four appearances against Real.
"He is great player and with his speed he is always a dangerous player," said Dortmund boss Peter Bosz. "I hope he stays a long time with us."
Ronaldo was wrongly denied his second of the night by the offside flag as he prodded home from close range.
But moments later Madrid did grab the winner when Vazquez's effort trundled past Burki, who was slow to react as the ball nestled in the bottom corner.
Dortmund should still have earned a share of the points, but Kagawa blasted a glorious chance over the bar as the German giants' run without a win in the Champions League or Bundesliga stretched to 11 games.
"The performances have to improve," admitted former Ajax coach Bosz, whose job is under serious threat. "We started very badly, but after we showed how well we can play and the return of some injured players in December gives us hope for the future."
COMMENTS
Comments are moderated and generally will be posted if they are on-topic and not abusive.
For more information, please see our Comments FAQ