Goals from Majeed Waris and Kwadwo Asamoah gave the Black Stars a two-goal advantage just past the hour mark, before Nathan Sinkala netted to create a tense climax.
Ghana topped the four-nation mini-league with 15 points from six games, their only setback being a 1-0 away loss to the Chipolopolo (Copper Bullets) last year. Zambia finished with 11 points and Sudan and Lesotho, who have two points each, meet in Omdurman on Sunday to decide who avoids the embarrassment of finishing bottom.
Algeria, Côte d’Ivoire and Egypt reached the play-offs ahead of the final round, and another six places are up for grabs on Saturday and Sunday.
Ghana controlled possession for most of the opening half at Baba Yara Stadium - home to two-time African champions Asante Kotoko - and deservedly led 1-0 at half-time.
Zambia scrambled to safety an Asamoah corner on ten minutes and Asamoah Gyan was off target soon after having being set up by a superb Andre Ayew pass.
But constant Black Stars' pressure told on 17 minutes, as Russia-based striker Waris headed the South Africa 2010 quarter-finalists in front. John Boye crossed from the edge of the box and Waris nodded past Kennedy Mweene to break the deadlock.
The goal emboldened the hosts and Gyan unleashed a long-range attempt that was deflected for a corner while Mubarak Wakaso was just over with his free-kick.
Zambia came more into the game as the half-hour mark passed, and Ghana goalkeeper Fatawu Dauda needed two attempts to clutch the ball following a Rainford Kalaba free-kick. Dauda gave his defence another fright just three minutes later as he spilled a shot after a neat passing movement, only to gather the ball as it ran loose.
The early second-half exchanges produced more Zambian pressure and Ghana coach Kwesi Appiah reacted by introducing Michael Essien on 55 minutes to tighten the midfield.
Just past the hour mark Ghana scored a second goal against the run of play, as Asamoah struck from 25 meres with a swerving shot that eluded Mweene.
Zambia halved the deficit 18 minutes from time as Sinkala swept a Kalala corner past Dauda, but the task of scoring twice more to survive proved beyond the visitors.