De Kock hit four sixes in a brilliant 135 and Amla made 127 as the hosts reached their target of 319 with 22 balls to spare at Centurion.
Joe Root hit five sixes in 125 - his highest one-day international score - but England's 318-8 proved inadequate.
England lead the series 2-1 with two matches to play.
Coming together at 36-1 after Jason Roy was run out for 20, Root shared stands of 125 with Alex Hales (65 off 73) and 82 with Ben Stokes (53 off 37).
Hales and Root played sensibly to bring up their fifties in the 23rd over but Hales, who made 99 in the second ODI, got out when he hooked Kagiso Rabada straight to Morne Morkel on the fine leg boundary.
In-form Jos Buttler was promoted to number four but was out first ball, flicking Rabada to leg gully.
England captain Eoin Morgan struggled to find his timing, labouring to eight off 24 balls before he was caught at mid-wicket.
But Root continued to bat with skill, reaching his hundred off 95 balls, and then hitting two sixes and a four from his next three deliveries.
The Yorkshireman was finally run out in the 43rd over when a straight drive ricocheted off the non-striker's stumps into the leg-side field and a mix-up with Stokes left the 25-year-old stranded.
Stokes raced to his 50 in 33 balls - and despite a rush of late wickets as Kyle Abbott took two in two, David Willey and Adil Rashid added late runs to set South Africa a testing target.
De Kock and Amla ignored the thunder and lightning rumbling around the stadium to get South Africa off to a perfect start.
De Kock took advantage of anything slightly wide while Amla moved around the crease to upset the bowlers' lines, enabling the duo to bring up their century stand in the 18th over.
England's spinners bowled in tandem but were unable to slow the scoring, with De Kock cracking three sixes on his way to his century from 96 balls.
The onslaught continued with Amla supporting De Kock from the other end, whipping the ball off his legs for a six as England's bowlers grew increasingly resigned to their fate.
The stand was finally broken when De Kock tamely chipped Rashid to Root at mid-wicket.
But Amla reached his century to move level with Chris Gayle, Tillakaratne Dilshan and Sourav Ganguly in seventh place in the all-time ODI centuries list.
The 32-year-old saw his team to the verge of victory before he was caught behind off Chris Jordan with just eight runs required.
Faf du Plessis hit a six to level the scores and then hit the winning run next ball to keep the series alive heading to Johannesburg on Friday for the fourth match.
England captain Eoin Morgan: "I thought 318 was a good score. The wicket got a little worse as our innings went on and a little wear and tear crept in, but Joe Root was outstanding.
"They had an incredible opening partnership but I thought we let them get away. The ball didn't swing early on so we had to go back to hitting our lengths, and we didn't do that well enough to create pressure."
South Africa captain AB de Villiers: "We needed that win, and I thought the boys played really well. We had a bit of urgency and hunger in the field. We've not had the greatest series until today but that shows the attitude we have.
"We have a little bit of local knowledge. I'm from here and so are a couple of guys in the team and we feel it's definitely a chasing kind of wicket. I didn't win the toss but I was going to bowl first anyway. It's very difficult to defend here at night."
Former England opener Geoffrey Boycott:
"I don't think England did a lot wrong in their bowling, and their fielding was quite good, but nothing happened for them. Rashid bowled quite well - he tried to mix it up because wickets were everything.
"The team lacks a bit of something. Steven Finn and Stuart Broad would both improve it. Reece Topley needs a bit more pace and I do worry about Jordan. He is a fantastic fielder, but Finn and Broad are better bowlers and add something more.
"But in the end we still might have lost because Amla played that well and De Kock was scintillating."
Quinton de Kock and Hashim Amla put on 239 for the first wicket to help South Africa beat England by seven wickets in the third one-day international.