The visitors started the brighter of the two sides, coming close on 13 minutes when full-back Danilo fired a shot from 25 yards, sending Shakhtar goalkeeper Andriy Pyatov scrambling across his line only to watch the ball go inches wide.
Pyatov would be kept busy for the majority of the half, with Porto continuing to threaten, and the Ukraine international keeper was called upon to stop his team from going behind on 35 minutes when the referee pointed to the penalty spot.
A counter-attack by Porto led to Yacine Brahimi skipping over a challenge from Oleksandr Kucher, who could not resist clipping the attacker's legs and giving away the penalty. Brahimi dusted himself down and took the spot kick himself, but the keeper read the shot well, diving to his right and pushing the ball clear of danger.
Porto continued to push for the opener, though, with Brahimi and Cristian Tello again threatening, though the latter wasted the last chance of the half after he got in behind the defence and dragged his shot wide.
The Portuguese started the second half as they started the first, though they gave their hosts a gift only five minutes after the restart. As Oliver Torres tried to dribble the ball inside his own penalty area he was robbed by Kucher, leaving the defender with enough time to square the ball to Alex Teixeira to tap into an empty net.
Porto would not be deterred despite falling behind and continued to work the ball well down the flanks, Juan Quintero cutting inside onto his left foot and testing Pyatov with a shot down low that the keeper was equal to.
Despite their attacking intent, it would be another piece of sloppy defending that led to Porto going two goals down with five minutes left on the clock. Maicon carelessly lost the ball to Ilsinho on the edge of his area, allowing the Shakhtar man to cross to Luiz Adriano to tap in at the back post.
With minutes remaining, it looked as though Porto's efforts would count for nothing on the night, though their persistence would finally pay off.
Two goals in two minutes for Jackson Martinez would give the visitors the draw they worked so hard for, the first coming from the penalty spot on 89 minutes after a handball by Yaroslav Rakitskiy, the second a tap-in after a dangerous cross from Danilo found the substitute unmarked in the six-yard box.
Shakhtar keeper Pyatov will consider himself unlucky after going the right way and nearly stopping the second spot kick of the night, although he could do nothing to stop the equaliser going in and the points from being shared.