In a match reduced to 20 overs a side, a fifth-wicket partnership of 64 between Eoin Morgan and Ravi Bopara put England in sight of a victory target of 130 and their first major 50-over trophy.
But the pair fell to successive deliveries by Ishant Sharma and England’s lower order crumbled as the hosts finished on 124 for eight.
Miserly bowling by Bopara and James Tredwell helped England restrict India to 129 for seven after the start of play had been delayed by nearly six hours due to persistent rain.
Virat Kohli top-scored with 43 and Shikhar Dhawan, the tournament’s leading run-scorer, made a breezy 31 but India were never able to dominate a disciplined England attack.
Rohit Sharma was bowled by Stuart Broad for nine and Dhawan mis-timed a drive in Bopara’s first over and was caught by Tredwell at mid-off.
Dinesh Karthik skied a catch off Tredwell and Bopara struck twice in his third over, getting Suresh Raina caught by Alastair Cook at mid-on and dangerman MS Dhoni well taken by Tredwell on the third man boundary.
Bopara completed excellent figures of three for 20 but Kohli and Ravindra Jadeja took 30 runs off the next three overs and Kohli, badly dropped by Jonathan Trott, launched Broad for a massive six over square leg.
Kohli skied James Anderson to long off but Jadeja finished unbeaten on 33 after clouting Tim Bresnan for another six in the final over of the innings.
England lost wickets steadily at the start of their reply.
Cook fell for two, edging a catch to first slip off Umesh Yadav, Trott made a fluent 20 off 17 balls before being stumped by Dhoni off Ravichandran Ashwin and Joe Root pulled the same bowler straight to long leg.