The South Africans went behind early on to Gelson, but fought back brilliantly through goals by Tokelo Rantie, Thamsanqa Gabuza and an Andile Jali penalty.
One blight on the performance at the Ombaka National Stadium was a red card shown to Jali late on, meaning he will miss the return leg in Durban on Tuesday night.
Bafana got off to the worst possible start, conceding a goal after just 90 seconds. Some wasteful play up-front allowed the hosts to break through Gelson, who beat three defenders on the edge of the area before firing into the bottom-left corner.
But rather than bemoan their fortunes, Bafana fought back strongly and were rewarded with an equaliser 12 minutes later. Rantie was the scorer, finishing beautifully into the bottom corner from Thabo Matlaba’s lay-off.
Six minutes later and the visitors had turned it around, taking the lead through Gabuza after a lovely through-ball from Mandla Masango.
Bafana’s confidence was up and they continued to threaten, with Thulani Serero coming close with a long-range shot.
However, South Africa had a poor start to the second half, opting to sit back and defend their lead. As a result chances were few and far between, but they did get the third goal – albeit in fortuitous circumstances.
Rantie beat the offside trap after a beautiful pass from Jali, but goalkeeper Dominique made a seemingly legitimate save at the striker’s feet.
Not in the eyes of Ethiopian referee Bamlak Tesseme though, who had an embarrassing afternoon with the whistle. He pointed to the spot and Jali, after much baiting from the goalie, coolly slotted into the corner.
However, he was then shown a second yellow – the first shown after he got slapped on the head and squared up against Buata – for inciting the crowd with his celebration.
It meant a nervy final few minutes for Bafana, but they held on for a comfortable win and will take a whole lot of confidence going into Tuesday night’s return match.
Angola: Dominique, Clinton, Buatu (Dario 24'), Kusunga, Adao (Moco 85'), Djalma, Gelson, Papel (Menga Dolly 70'), Bastos (capt), Natael, Bua
South Africa: Mabokgwane (capt), Ngcongca, Matlaba, Coetzee, Mathoho, Masango (Lebese 65'), Zungu (Furman 59'), Jali (sent off 83'), Serero (Makola 55'), Gabuza, Rantie