Riding on Shikhar Dhawan's 125 and half-centuries from Rohit Sharma and Mahendra Singh Dhoni, India piled up a 321 for 6 only to be stunned by unfancied Lankan batting line-up that produced a splendid batting show to knock off the runs in 48.4 overs.
Danushka Gunathilaka (76 off 72 balls) and Kusal Mendis (89 off 93) added 159 runs to lay the platform before skipper Angelo Mathews (52 no off 44 balls) coolly finished off the job in company of Kusal Janith Perera (47 retired hurt) and Asela Gunaratne (34 no off 21 balls).
For India, the 103 runs conceded by Hardik Pandya (51 off 7 overs) and Ravindra Jadeja (52 off 6 overs) in 13 overs tilted the game decisively in favour of Lankans on what was a batting belter where a target of 322 looked par for the course.
Call it complacency or unable to gauge the strength of unknown entity, the Indian bowling lacked the required discipline as Gunathilaka and Mendis rolled back the years giving a glimpse of the Lankan sides of mid and late 90's.
They were hardly bothered by any bowler during their 159 run stand.
Left-hander Gunathilaka especially was severe first up, hitting seven fours and two sixes. The first one was using Umesh yadav's extra pace to pull it behind square while the next was another pull in-front of square when Hardik erred in length.
What hurt India during the phase was poor show from Jadeja, whose first six overs cost 52 runs including seven fours and a six.
Mendis was severe on him as he bowled short and also didn't have any help from pitch made life tougher.
With regular bowlers failing to do the job, captain Kohli brought himself and Kedar Jadhav. But Gunathilaka was run-out more so because of Mahendra Singh Dhoni's quicksilver reflexes.
India created further inroads when the other set batsman Mendis was run-out, courtesy brilliant pick up and throw off his own bowling by Bhuvneshwar Kumar.
But skipper Mathews and Perera added 75 runs in 10.2 overs to ensure that islanders don't lose momentum.
However Perera had to retire suffering cramps with Gunaratne joining his skipper with 51 runs required in a little over seven overs. The youngster then chanced his arms against Bumrah and Yadav to finish the game much to delight of Sri Lankan fans.
Earlier Dhawan continued his love affair with the Champions Trophy with yet another elegant hundred, guiding India to an imposing 321 for 6 after being put into bat.
Dhawan smashed his way to a 10th career ODI hundred, and added 138 for the opening stand with Rohit Sharma, who cruised his way to a languid 78 off 79 balls.
This was Dhawan's third hundred in Champions Trophy, having scored a couple during last edition. His entertaining innings comprised 15 fours and a six.
He got an able ally in Dhoni, who got an ideal platform coming in to bat in the 34th over. The fourth wicket stand produced 82 runs in 10.4 overs.
The former captain used all his experience, hitting seven fours and two sixes on way to reaching his 62nd ODI half- century. Jadhav's (25 of 13 balls) cameo was icing on the cake.
Mathews wanted his bowlers to make first use of the wicket but the pace trio of Lasith Malinga (2/70 in 10 overs), Suranga Lakmal (1/72 in 10 overs) and Nuwan Pradeep (1/73 in 10 overs) most of the times bowled short of length only to be pulled time and again by the Indian batsmen.
Worse, they were again behind the stipulated over-rate.
The best part about Dhawan's innings was the sheer effortlessness with which he shifted gears. He started on an attacking note only to drop anchor when Rohit upped the ante before another round of attractive strokeplay after the loss of Virat Kohli (0) and Yuvraj Singh (7) in quick succession.
For Rohit, the 91 on comeback against Pakistan had given him enough confidence to caress the very first delivery of the match bowled by Malinga to wide off point.
Dhawan in the very next over played an imperious cut shot off Lakmal. He followed it up with a cover drive off Malinga's bowling but it was a cautious start during those first five overs that yielded 17 runs.
While the runs didn't come at a quick clip but there was no incisive quality in Lankan attack that could have troubled the openers.
Malinga, who is nearing the end of his ODI career, lacked bite in his bowling. The openers didn't take chances against the slinger but also weren't in any kind of trouble.
Their understanding was there to be seen. When Rohit was playing himself in, Dhawan attacked the bowlers but once the Mumbaikar got a hang of the track, the southpaw quietly slipped playing the role of a second fiddle.
By the 10th over, the Lankan bowling started losing its grip and by the 20th over, it lay in complete tatters with Mathews lacking a plan B to stop the duo from scoring freely.
The 100 came up in the 20th over - their second century stand in successive overs.
Rohit pulled Thisara Perera over deep square leg boundary to complete his half-century and then celebrated it with another pulled six that was hit finer.
Rohit's fetish for pull shot was evident when he got his third six - this time off Malinga before perishing trying to hit a fourth one.