The tourists, whose previous win on these shores came in 2001, needed just half-an-hour on day five to dismiss Sri Lanka for 243 - taking the last three wickets for 17 runs.
Moeen Ali claimed the key scalp of Niroshan Dickwella for 35, then clean bowled Suranga Lakmal for duck before Jack Leach ended things with a caught and bowled to see off last man Malinda Pushpakumara and bag his maiden five-wicket haul.
England take a 2-0 lead into the final match in Colombo, eyeing a historic clean sweep.
Beating Sri Lanka is not quite the scalp it was in the days of Muttiah Muralitharan, Kumar Sangakkara and Mahela Jayawardene but this still represents a considerable achievement given they have lost only one of the previous six series on home soil and recently thrashed South Africa.
It also represents England’s first away triumph since they defeated the Proteas in 2015/16, and a first with Joe Root at the helm.
Root’s side had arrived at Pallekele Stadium as favourites to finish the job, with two late wickets on day four swinging the momentum sharply in their direction after Angelo Mathews’ fightback.
Home hopes laid squarely with Dickwella, a talented ball-striker more suited to a blaze of glory than a meticulous chase.
He played against type as he and Akila Dananjaya knuckled down for almost five overs, working singles to chalk off 14 from their target.
There was nothing to alarm England beyond the batsmen’s steady mindset and enough turn for both their left and right-arm finger spinners to work with.
Had they had to wait much longer, the tension would surely have begun ratcheting up, but Moeen hit the jackpot with the first ball of his third over.
He tossed one up to tempt Dickwella and ripped it just enough to take the edge and sail safely to Ben Stokes at slip.
Dickwella pivoted angrily on his heel and gestured towards the stumps with his bat, knowing he had left too much for the tail to do.
Moeen wasted no time in besting Lakmal, a big lbw appeal first up and then pegging back off stump as the next ball straightened from around the wicket.
He finished with four for 72, with left-armer Leach drawing things to a close by pouching the simplest of return catches from Pushpakumara.
That saw him close on 5-83 and also ensured a record 38 of the 40 wickets to fall in the match had been taken by spinners.
Lakmal’s dismissal of Keaton Jennings on the first morning was the seamer’s only scalp, with Stokes chiming in with a first-innings run out.
According to data analysts CricViz, the last time no English seamer took a wicket in a match was in Karachi in 1973.