Ronaldo scored his 100th Champions League goal for title-holders Real from the penalty spot late in the first half to cancel out Adrien Rabiot's opener for the French side at the Santiago Bernabeu, set up by Neymar.
The Portuguese star then turned the ball home from close range with seven minutes left before Marcelo secured what could turn out to be a decisive first-leg lead ahead of the return in Paris on March 6 and sent nearly 80,000 home fans into raptures.
"These days are to be remembered, and what better way to do it than with the character we showed," Real skipper Sergio Ramos told Spanish television.
"We need to keep playing like that, with the desire to defend the Champions League. You can never consider Real Madrid to be dead and buried."
Rabiot said PSG were plagued by familiar problems
"We always say the same things and we always get caught out in the same way," Rabiot told beIN Sports.
"The problem is it's easy to score eight against Dijon, or four goals in league games. It is in these matches that you need to be decisive."
The late collapse for PSG brings back echoes of the way they fell apart to lose 6-1 in Barcelona on their way to a humiliating exit at the same stage of the competition last season.
Neymar, in Barcelona's ranks then, could not make the difference for PSG, who now have a huge job on their hands to turn the tie around.
Having looked set to come away with a precious draw, the defeat piles the pressure on coach Unai Emery, but for Real the outcome is an enormous boost for their boss Zinedine Zidane.
Under pressure himself with Real flagging domestically, he needed this win, and will earn praise for his substitutions, with Marco Asensio coming off the bench to set up each of the two late goals.
That was after Zidane had taken a risk by leaving out Gareth Bale, a key element in the side that has won three of the last four Champions Leagues. The Welshman's place in the line-up was taken by Isco.
Emery went even further, dropping his captain Thiago Silva to make way for 22-year-old Presnel Kimpembe in the centre of the PSG defence.
Difficult night for Neymar
Real supporters chose an image of a famous fan in Rafael Nadal to adorn a display unfurled at the south end of the ground as the sides came out, hoping their team could draw inspiration from someone who has conquered Paris 10 times as French Open champion.
The hosts started well too, while Neymar struggled, slipping when one pass was aimed towards him, complaining as a Luka Modric challenge sent him to the floor and picking up a yellow card for a foul on Nacho.
Ronaldo, meanwhile, saw Alphonse Areola make a fine save from his net-bound shot after he had been released by Marcelo, and not long after that, in the 33rd minute, PSG scored.
Neymar could claim an assist, although it didn't look like the Brazilian meant to help Kylian Mbappe's low ball across the box from the right into the path of Rabiot, who swept home unmarked.
PSG had a precious away goal, but they could not hold their lead until the break as Giovani Lo Celso gave away a penalty for a foul on Toni Kroos.
Areola, having just made a superb save from Karim Benzema, could do nothing to keep out Ronaldo's spot-kick.
The visitors had chances to go ahead again in the second half, Keylor Navas saving well from Mbappe and Sergio Ramos blocking bravely from Rabiot.
Emery then surprisingly took off Edinson Cavani and replaced him with Thomas Meunier, a right-back. But it was Zidane's decision to send on Asensio that proved crucial.
In the space of three late minutes, Asensio saw one cross palmed out by Areola and then rebound into the net off Ronaldo's thigh, before another assist was finished off by Marcelo, potentially finishing the tie in the process.
By Andy Scott / AFP