John Danks kept Chicago in the game by pitching into the seventh inning in his first start in more than a year. He received a standing ovation when he left the mound.
Miami tied the game with a run charged to Danks in the seventh and the contest remained deadlocked until the White Sox got to reliever Ryan Webb (1-2) in the 11th.
Paul Konerko singled with one out, Dayan Viciedo reached on an infield hit and Conor Gillaspie drew a walk that loaded the bases.
That brought up Keppinger, who laced a 1-0 pitch to left that brought home pinch-runner Tyler Greene with the winning run.
Nate Jones (1-4) earned the winning by recording the final two outs in the top of the 11th.
Chicago's Alex Rios had a sixth-inning single that extended his hitting streak to a career-best 18 games.