New Zealand, chasing 170 for victory in a match reduced by rain to 24 overs per side, were held by the tournament hosts to 159 for eight.
Victory saw England, yet to win a major 50-over competition, into the last four as one of two qualifiers out of Group A after their build-up for this match was overshadowed by ball-tampering allegations made against them by former captain Bob Willis.
If Sri Lanka beat champions Australia in Monday's final Group A fixture at The Oval they will also feature in a last four that already includes Group B winners India and runners-up South Africa.
New Zealand could yet reach the semi-finals themselves if Australia win but fail to do so by a large enough margin to better the Black Caps' net run-rate.
James Anderson, who finished with three wickets for 32 runs in five overs, reduced New Zealand to 14 for two by dismissing openers Luke Ronchi and Martin Guptill in the space of three balls.
Medium-pacer Ravi Bopara, in overcast conditions assisting seamers, took two for 26 in five overs.
England captain Alastair Cook, the man-of-the-match, was dropped three times by Nathan McCullum on his way to top-scoring with 64 in a total of 169 all out.
Off-spinner Nathan McCullum finally clung on to a return offering from his own bowling to dismiss left-handed opener Cook.
"It was quite a stressful day. I always felt we were just above the rate but you can get as many as you want but you always want more," said Cook at the post-match presentation ceremony.
"It was a very fine bowling performance. We were very good in the field today and good with the bat.
"We were 10 runs short but 170 is still a very good score."
After New Zealand slumped to 61 for five, Kane Williamson (67) and one-day international debutant Corey Anderson (30) kept them in the hunt with a partnership of 73 before they both fell in the closing stages.
"England bowled outstandingly well at the start of our innings and set us back," said New Zealand captain Brendon McCullum, Nathan's younger brother.
"Kane and Corey gave us a real opportunity but we fell short in the end.
"We did drop some catches but Nathan is usually a good catcher so it is one of those things. We'll be supporting Australia now, which is not something that we normally like to do."
Coming into this match, England and New Zealand had already played each other in six one-dayers this year, winning three each across series in both countries.
And the gap between the sides in this match narrowed when Williamson completed a 48-ball fifty by striking Anderson for his seventh four before lofting Tim Bresnan for six.
Suddenly, New Zealand needed 36 to win off 18 balls with five wickets left.
But Williamson then holed out off Stuart Broad, although the paceman had a nervous wait before a review for a tight no-ball call went in his favour.
And 135 for six became 140 for seven when Corey Anderson was caught by James Anderson off Bresnan. That left New Zealand needing 30 to win off 10 balls.
It was just too much and James Anderson wrapped up victory when Nathan McCullum was caught behind off the final delivery of the match.
After New Zealand won the toss, England were 25 for two when Jonathan Trott chipped Kyle Mills to Nathan McCullum at mid-wicket.
Trott's exit gave Mills his 25th Champions Trophy wicket, surpassing the competition record of retired Sri Lanka off-spinner Muttiah Muralitharan.
James Franklin almost struck first ball when Cook pulled him to mid-wicket only for Nathan McCullum to drop the chance.
Franklin almost had him again only for Nathan McCullum to drop a juggled chance at mid-wicket.
Nathan McCullum then put down a relatively easy catch when, at backward point, he dropped Cook's cut off Williamson.
COMMENTS
Comments are moderated and generally will be posted if they are on-topic and not abusive.
For more information, please see our Comments FAQ