Real Madrid 2-0 Borussia Dortmund (agg 3-4)
Borussia Dortmund survived a frantic finish at the Bernabeu to reach the Champions League final despite two late goals by Real Madrid.
Real, trailing 4-1 from the first leg, needed to score three times without reply to progress but wasted a series of early chances in an open game.
Karim Benzema gave Real hope from close range in the 82nd minute and Sergio Ramos scored a second soon after.
Ramos also headed wide in injury time but Dortmund held on.
Such a thrilling ending to the tie had seemed unlikely after the first leg at the Westfalenstadion and also for long spells in Spain, but Real will feel real frustration at their exit because of the sheer number of chances they squandered.
Dortmund also had several openings and could have put things beyond doubt when Robert Lewandowski fired against the bar in the second half.
Instead they were left hanging on before securing their date at Wembley on 25 May, where they will play either Barcelona or, as appears likely, German rivals Bayern Munich.
Ball after ball was pumped into the visitors' box and Real also felt they should have had a penalty when Felipe Santana clashed with Cristiano Ronaldo.
It was the dramatic ending that Real's fans had demanded from the start, but their team's response came far too late.
Jose Mourinho's men badly needed an early goal to find a way back into the tie and the high quality of their attacking play in the early stages probably deserved one.
But the finish Real required eluded them. Gonzalo Higuain fired straight at Roman Weidenfeller after Mesut Ozil squeezed him clear and Cristiano Ronaldo repeated the trick after getting on the end of a clipped ball into the area.
Ozil had more time to consider his strike after running clear but he could do no better, dragging his shot wide.
Dortmund did have a chance of their own against the run of play, when Lewandowski scuffed his shot after finding space from the free-kick, but the first 15 minutes were all about survival for the German side.
Sadly for Real, they could not maintain such a high tempo and, by half-time, Dortmund had established a foothold in the game as well as maintaining their commanding aggregate advantage.
Jurgen Klopp's side should have ended Real's resistance completely after the break, firstly when Marco Reus stole possession and fed Lewandowski to smash his shot against the bar.
And it took a brilliant stop from Real keeper Diego Lopez to deny Ilkay Gundogan as he ran unchallenged to meet another Reus cross from six yards out.
By now there were big gaps in the Real defence but their risky approach in piling men forward paid off with eight minutes to go.
Ozil found space down the right and his low cross was turned in by Benzema.
That gave the home fans a new voice, and they were sent into a frenzy by Real's second goal, which came from a corner after Weidenfeller tipped over another Benzema shot.
Benzema found Ramos with a pull-back and he took a touch before rifling his shot into the roof of the net.
Dortmund, previously unbeaten in Europe this season, looked shaken, but they recovered their composure at the back and, for all Real's efforts during five minutes of injury time, a third goal was beyond them.