PSG dominated the early proceedings, with Edinson Cavani pouncing on a defensive howler from Rennes captain Damien da Silva.
The centre-back misplaced a pass in his own penalty area, which the Uruguayan reached first to give the visitors a 1-0 lead.
Rennes replied quickly, when Senegal forward M'Baye Niang held-off PSG defender Marquinhos before smoothly curling an effort into the bottom corner.
The home side took the lead four minutes into the second half, after Romain Del Castillo headed in 16-year-old Eduardo Camavinga's sublime cross.
Rennes boss Julien Stephan said Camavinga, the first player born after January 2002 to play in Europe’s top five leagues, is improving by the day.
"He's been training with professionals for more than six months. He's settled in well with the squad," he told Canal+.
"We've prepared him with the players, the staff and the whole club so he can evolve in the right conditions.”
📆 April 2019Football on BT Sport (@btsportfootball) August 18, 2019
Rennes beat PSG in Coupe de France final
📆 August 2019
Rennes beat PSG in Ligue 1
PSG were without Neymar for a third successive game with the Brazilian attracting growing interest from Barcelona and Real Madrid.
Kylian Mbappe and Cavani had late chances but they could not save PSG's blushes, losing to the side who finished in 10th place last season.
PSG captain Thiago Silva admitted his team lost concentration after a good start to the match.
"It wasn't the real PSG. Rennes played well, they were solid defensively, they were more careful than us," he said.
The Parisians will be hoping to return to winning ways at home to Toulouse at the weekend, while Rennes look to continue their perfect start to the season away at Strasbourg.