Belgium international Witsel drilled a shot in off the underside of the crossbar in the 19th minute, and that proved enough for Lucien Favre's side to triumph in the injury-enforced absence of Marco Reus.
Timo Werner and Marcel Sabitzer were unable to pounce on opportunities to equalise and Dortmund - who introduced Christian Pulisic in the 76th minute for his first appearance since signing for Chelsea - could pull nine points clear with their next match against Hannover coming 24 hours before Bayern face Stuttgart.
Dayot Upamecano and Ibrahima Konate did well to keep Mario Gotze and Maximilian Philipp at bay respectively in the opening 15 minutes, but Leipzig's defence was soon undone.
Raphael Guerreiro's corner was flicked on by Lukasz Piszczek and Witsel, who also scored in the reverse fixture earlier this season, took a touch before firing home with assistance from the frame of the goal.
200 - Lukas #Piszczek will today start a #Bundesliga game as captain for Borussia Dortmund for the first time - making his 200th appearance in Dortmund's starting XI in the Bundesliga. Honour. @BlackYellow #RBLBVB pic.twitter.com/yJjtDnGQfx— OptaFranz (@OptaFranz) January 19, 2019
Abdou Diallo headed narrowly wide before half-time and Philipp was denied by a great save from Peter Gulacsi eight minutes into the second period.
At the other end, Roman Burki slipped as Thomas Delaney passed back to him and the goalkeeper sent the ball straight to Werner. He lunged in with a tackle that dispossessed the Leipzig striker, who felt he had been fouled, and Yussuf Poulsen was unable to get an effort away on the follow-up.
Burki looked far more assured when he kept out Sabitzer, before substitute Paco Alcacer saw his 90th-minute effort bounce down off the bar and stay out.
Matheus Cunha headed narrowly wide in stoppage time as Leipzig's unbeaten home Bundesliga run ended after a club-record 10 matches.