The 23-year-old, in his eighth Test, was dropped three times but reached an entertaining hundred from 104 balls.
England claimed two wickets in five balls early on but left-hander De Kock shared in stands of 50 and 82 and was unbeaten on 129 as his team made 475.
In reply Alex Hales fell cheaply but Alastair Cook held firm with 67.
South Africa resumed on 329-5 with De Kock on 29 and added 146 runs in 42 overs before they were bowled out midway through the afternoon session.
Media playback is not supported on this device
Fast bowler Kagiso Rabada claimed two early England wickets, trapping Nick Compton for 19 with one that pitched halfway down the wicket but hit barely above the boots.
The increasingly uneven bounce will give South Africa, who have already lost the series, hope of a consolation victory.
England's new opener Hales, playing his seventh Test innings, struck three fluent boundaries in his 15 from 14 balls, with consecutive attractive strokes to the fence through the off-side off the back foot.
But in the sixth over he skewed a loose drive, which was comfortably caught at backward point.
Former England captain Michael Vaughan told Test Match Special: "It was a terrible dismissal. He gifted an opportunity and it is another one to put in the list of failures.
"He looks in two minds at the crease, unsure whether to go for the full-on aggressive shot or a checked drive."
Hales, who has passed 50 only once in seven innings in the series, is the eighth opening partner for Cook since the retirement of former skipper Andrew Strauss in 2012.
The current captain showed a welcome return to form, however, looking assured in his first fifty of the series - and the 47th of his Test career - and is only 50 short of becoming the first England player to score 10,000 Test runs.
Joe Root edged a delivery fractionally short of De Kock behind the stumps as the occasional ball misbehaved but England's two leading batsmen put on 60 to take them to the close without further loss.
Having reprieved centurions Stephen Cook and Hashim Amla with dropped catches on day one, England were guilty of further errors in the field as South Africa pressed on to a commanding first innings total.
In only the third over of the day De Kock scythed James Anderson to gully where a diving Ben Stokes could not grasp the chance.
On 80, De Kock edged the luckless Chris Woakes and bisected wicketkeeper Jonny Bairstow and wide first slip Alastair Cook, neither of whom went for the catch.
Ten runs later, De Kock's drive at Moeen Ali went through the hands of Cook at short extra-cover.
The left-hander played an array of shots all around the wicket and was particularly severe on Moeen Ali.
He scored 45 runs off the spinner in only 28 balls, including two mighty leg-side sixes, one of which nearly landed on a cameraman behind the long-on boundary.
Former South Africa wicketkeeper Mark Boucher: "The pitch is not going to get any better; those cracks are going to widen. Batting from now on is going to be hard graft. In the last innings it will be a real lottery.
"You do feel that if South Africa get it right in a session, they will do some proper damage. You could have a session where England go 60-4."
Ex-England skipper Michael Vaughan: "There's going to be more low bounce over the next three days. You're under a lot of pressure when a team gets 475 on the board - you're only one bad session away from losing the match.
"If England get out of this Test with something, they'll have done brilliantly."
Quinton de Kock's maiden Test century put South Africa in command of the final Test as England closed day two in Centurion 337 runs behind on 138-2.