PSG will rue their poor finishing as they missed several chances, especially in the first period when Adrien Rabiot’s volley hit the post after 37 minutes.
Former-Real player Angel Di Maria also struck the woodwork late on with a free-kick for the visitors.
“It was not a comfortable game for us at all,” Real defender Sergio Ramos told reporters.
“It was a difficult game and it has given us a lot to think about. We played a lot better away in Paris where we could only draw. We were up against a strong side with good players who had a lot of possession and created chances.”
Real have 10 points from four games in Group A while PSG, who suffered their first defeat in all competitions this season, are second with seven. Shakhtar Donetsk beat visiting Malmo 4-0 in the other group match with both teams now on three points.
There was a disruptive start to the game with players receiving treatment for knocks and PSG lost Marco Verratti after 17 minutes with what appeared to be a twisted ankle and he was replaced by the 20-year-old Rabiot.
It was the visitors who found their feet first with a shot from Blaise Matuidi straight at goalkeeper Keylor Navas and then Zlatan Ibrahimovic, inside the area, stroked the ball a whisker the wrong side of the right post.
Real fullback Marcelo then limped off after 33 minutes to add to the home side’s injury problems this season, with Gareth Bale and Karim Benzema among those unfit to face the French.
Replacement Nacho made an instant impact by knocking the ball home after a Kroos shot deflected to him off Thiago Silva.
Real responded when Rabiot hit the post with a long-range volley and Edinson Cavani miscued with only Navas to beat in first half stoppage time.
After the restart Di Maria was also denied by Navas in front of goal but as the game went on Real took most of the steam out of the contest. Di Maria was inches away in the 89th minute, however, with a long-range free-kick that clipped the bar.
(Reporting by Tim Hanlon in Barcelona, editing by Ken Ferris)