Madrid, trailing 4-1 from the first leg in Germany, looked down and out with the score on the night 0-0 with eight minutes to go, but two quick goals produced a grandstand finish to a pulsating game.
Karim Benzema pulled one back and Sergio Ramos added another in the 88th minute, but Dortmund stood firm amid a frenzied atmosphere to seal a 4-3 aggregate win.
Dortmund was not the thunderous team that delighted football fans around the world with last week's performance, but produced a disciplined showing, with their centre-back pairing Mats Hummels and Neven Subotic particularly impressive.
It is Dortmund's second appearance in the Champions League final after its 1997 triumph, and this time it looks set to be an all-German affair, with Bayern Munich going into its semi-final, second leg against Barcelona leading 4-0.
And it ended Jose Mourinho's hopes of leading Madrid to glory in Europe's top club competition in what could be his last season at the Bernabeu.
Mourinho started with Luka Modric ahead of Sami Khedira in the hope of giving his side more attacking flair, while Angel di Maria returned to the starting line-up, having started the first leg on the bench.
Michael Essien stepped in at right-back, while Pepe, given a torrid time by Roberto Lewandowski in the first game, was left out.
Jurgen Klopp made no changes to the side that produced the blistering performance in the Westfalenstadion, but had to bring on Kevin Grosskreutz after just 14 minutes when Mario Gotze hobbled off injured.
The Madrid players took to the pitch amid a deafening noise, with the chant 'Yes we can' ringing around the stadium.
It began with the intensity the occasion demanded.
It won a corner within the first 30 seconds and Gonzalo Higuain was put through on goal by Modric after just four minutes, but he shot straight at Roman Weidenfeller.
Dortmund's first chance came on 13 minutes, Lewandowski finding his way past Raphael Varane after a throughball by Ilkay Gundogan but the four-goal first-leg hero could only shoot straight at Diego Lopez.
The goalkeeper cleared the ball and barely seconds later Cristiano Ronaldo, who struggled to hit his usual heights, got a glimpse of goal, but Weidenfeller stopped the shot with his right fist.
Mesut Ozil was then presented with a far better chance and had just Weidenfeller to beat after a pass from Modric, but the Germany midfielder aimed his shot a foot wide of the near post.
Dortmund slowly began to settle into the game and closed Madrid down in midfield.
It rode out the first half without ceding any more clear chances to Los Blancos, whose earlier energy fizzled out.
Madrid kept on the attack early in the second half, but left itself very exposed to the counter attack when it surrendered the ball.
Lewandowski blazed over from 10 yards out and moments later crashed a shot against the underside of the crossbar after a pass from Marco Reus, whose pace exploited a committed and increasingly drained Madrid.
Mourinho threw on Kaka and Benzema in place of Fabio Coentrao and Higuain, but neither player could do much to penetrate an energetic and robust Dortmund.
The German side could have wrapped the tie up midway through the second half.
Madrid was outnumbered as Dortmund launched another break and Reus combined with Grosskreutz to play in Gundogan five yards from goal, but Diego Lopez leapt across the goal superbly to keep the shot out.
The home crowd quietened as the game ticked on, losing faith in their side, which produced few clear openings.
Ronaldo headed wide and later shot over the bar from outside the box before Kaka shot wide from inside.
Modric went over in the box after a challenge from a Dortmund defender, but even few Madrid supporters behind the goal believed he should have been given a penalty.
At the other end, Lewandowski was denied his fifth goal in the semi-finals as his shot was blocked by Essien.
All of a sudden, Madrid got itself back in the tie.
Benzema slotted home from close range after a cut back from Ozil with six minutes remaining.
The crowd started to believe the seemingly impossible was on and roared their team on to another attack.
Madrid won a corner soon and Benzema almost got a second, but his shot was tipped over the bar by Weidenfeller.
From the second corner, Ramos smashed his shot into the roof of the net after a cut back from Benzema.
The Bernabeu became a cauldron of noise, but Madrid had just two minutes of normal time, plus five minutes of added time, to get that all important third goal.
Madrid got another corner a minute into stoppage-time. Diego Lopez ran up from his goal to contest it, but the ball fell to Ramos, who headed a few feet wide.
Dortmund sat back and absorbed the final moments of pressure to make it to the 25 May showpiece.