Failing to exert pressure despite taking an early lead, India hung on grimly against several threatening Canadian raids to clinch their second victory in three outings.
Chandana Thimmaiah opened the Indian account in the third minute, but Keegan Pereira equalised for Canada in the 23rd minute to be 1-1 level at half-time.
Harmanpreet Singh converted a penalty corner in the 41st minute and Talwinder Singh capitalised on a Sardar Singh cross into the circle in the 67th to seal the fate of the match.
Earlier in the day, Australia outplayed Pakistan 4-0, while New Zealand defeated Japan 4-1.
India's defence came under a lot of pressure today against Canada, who like India are drawn in Group B of the Olympics in Rio de Janeiro.
Goalkeeper Harjot Singh made a blunder of conceding the first penalty corner, but made a few good saves before he was replaced by Akash Chikte in the second quarter. Both the goalkeepers saved four good cracks at the Indian citadel from the Canadian strikers.
Trapping the ball cleanly, Sunil sent a cross that beat goalkeeper David Carter and left Thimmaiah to top the ball into an open goal.
The game thereafter was confined to the midfield until Canada forced their first penalty corner in the 13th minute and the low shot from Gordon Johnston was blocked by Indian custodian Harjot.
Harjot again came to India's rescue in the next minute when he made another fine save on Pereira's lunging reverse drive from close range.
It was against the run of play that Canada equalised in the 23rd minute on a fine counter when a long ball was relayed by Matthew Sermento to Pereira in the circle. With plenty of time and space allowed to him, Pereira made no mistake with his deft shot past the hapless goalkeeper.
Talwinder Singh had a chance to put India ahead again in the 27th minute when he received a cross from the left inside the circle, but the Canadian goalkeeper covered his shot well to ward off the danger.
Then it was again Canada's turn to give India some jitters as Sukhi Panesar took a shy at the goal, followed by two penalty corners in the last two minutes of the first half. One of the penalty corners attempts went wide and Chikte moved well to his right to palm away a low shot.
Ramandeep Singh had a fine opportunity to bolster the Indian lead in the 45th minute when he received a through ball from captain Sardar Singh in the circle. Ramandeep had only to beat a close-marking defender, but turned around and shot straight into the goalkeeper's pads.
Canada forced two penalty corners and the Indian defence lived dangerously before the ball sailed across the goal-line.
