Mats Hummels scored only his fifth Champions League goal – and first in 42 games since netting for Bayern Munich against Ajax in October 2018.
Borussia Dortmund produced a fine away performance to beat Paris St-Germain and reach their first Champions League final.
Dortmund held a 1-0 advantage following the first leg and doubled their lead when Mats Hummels was left unmarked five yards out to head in from Julian Brandt’s left-wing corner.
That goal came just after PSG’s Warren Zaire-Emery wasted a glorious chance as he volleyed against the post from close range early in the second half.
PSG hit the upright twice in the opening match in Germany and, after falling 2-0 behind on aggregate, again struck the post through Nuno Mendes.
The hosts thought they had been given a penalty and a potential lifeline when Italian referee Daniele Orsato pointed to the spot, only to instantly change his mind and rule that Hummels’ foul on Ousmane Dembele had been just outside the area.
PSG have never been European champions, losing in the 2020 final, and Dortmund produced an excellent defensive display to frustrate the French title winners.
Kylian Mbappe, in his last European match for PSG before joining Real Madrid in the summer, had an effort deflected on to the crossbar, before Vitinha fired against the bar too – the sixth time overall his side had hit the frame of the goal in the tie.
The final will be at Wembley on Saturday, 1 June (20:00 BST) and could be an all-German affair, just as it was in May 2013 when Bayern Munich beat Dortmund 2-1 in London.
Bayern and Real are in the second 2024 semi-final and the first leg ended 2-2 in Germany, with the second leg in Spain on Wednesday (20:00 BST).
Dortmund are aiming to become European champions for the second time in their history after they defeated Juventus 3-1 in the 1997 final.
Paris St-Germain v Borussia Dortmund as it happened, plus reaction and analysis
A huge display showing the Champions League trophy was produced behind one of the goals at Parc des Princes before the game
Superb Sancho and Dortmund frustrate Mbappe and PSG. Dortmund have had a disappointing season domestically as they sit fifth, 24 points behind champions Bayer Leverkusen with two Bundesliga matches remaining.
At the start of the European campaign, no-one could have expected Dortmund to be in the final after they were drawn in a tough group that consisted of PSG, AC Milan and Newcastle.
But Edin Terzic’s side finished top, before they got past PSV Eindhoven in the last 16 and then eliminated Atletico Madrid in the quarter-finals.
And even after an excellent 1-0 home win over PSG on 30 April, thanks to Niclas Fullkrug’s goal, many people expecting the French side to overpower them in the second leg.
However, Dortmund’s side, which included hard-working England winger Jadon Sancho, on loan from Manchester United after being frozen out by boss Erik ten Hag, produced a superb team effort at Parc des Princes.
In a wonderful, boisterous atmosphere, Dortmund were excellent in stopping the dangerous Mbappe scoring – the forward often up against two or three opponents – with the central defensive partnership of Hummels and Nico Schlotterbeck in fine form.
Mbappe had a volley saved by goalkeeper Gregor Kobel and only a superb sliding challenge from Hummels stopped Mbappe from finishing from Fabian Ruiz’s pull-back.
PSG hit the woodwork four times in the second half but despite sustained late pressure, with Mbappe having a shot saved and Marquinhos heading narrowly wide, could not find the break through as Dortmund reached the final.