Hector Herrera was sent off after just six minutes but the home side refused to back down and had the better of a cagey first half.
But in the 86th minute the impressive Hulk crossed for Kerzhakov to score and fire Zenit into second place in the group behind Atletico Madrid.
Herrera was given his marching orders after just six minutes in bizarre circumstances.
The midfielder was given his first booking for a foul on Hulk but dismissed just moments later after encroaching while Zenit were attempting to take the resulting free-kick.
When the set piece was eventually taken, Hulk saw his shot deflected behind off the wall with the following Andrey Arshavin corner coming to nothing.
Despite being down to 10 men, the home side were pressing and Danilo saw a shot from distance blocked away by Nicolas Lombaerts.
Hulk was then handed a gilt-edged opportunity to score against his former club but could only fire wide from six yards out when he really should have done better.
Josue had a chance with a free-kick but sent his 20-yard effort wide as Porto continued to battle and Lucho Gonzalez went even closer to putting them ahead as he hit the post.
Danny tried to respond against his countrymen but could only fire over the bar with the visitors limited to speculative efforts from distance.
Arshavin and Roman Shirokov both saw such efforts go wide as half-time approached but it was Porto who nearly took the lead as Eliaquim Mangala headed over the bar.
Despite their numerical disadvantage, Porto were looking the more likely to break the deadlock and both Jackson Martinez and Gonzalez tested Yuri Lodigin from distance after the break.
Helton was then called into action at the other hand as he made a smart save with his feet from Hulk and the Zenit striker was looking the most likely man to score as the half wore on.
And he nearly did in the 72nd minute as Helton made a spectacular save to stop his 20-yard free-kick.
When the goal did actually come, it was no surprise that the Brazilian had a hand in it with his cross finding Kerzhakov who slotted home from six yards.