The hosts gave up the majority of possession and territory to the world champions, but two goals from Antoine Griezmann proved to be the difference as Didier Deschamps's side set up a showdown with Portugal in Sunday's final at the Stade de France.
France went into the match unbeaten in their last 17 tournament games on home soil, and they immediately got on the front foot as they looked to draw on the raucous atmosphere.
They created a clear chance to do just that in the seventh minute when Griezmann exchanged passes with Blaise Matuidi before cutting inside into shooting space, but his low effort was pushed away by a smart stop from Manuel Neuer.
Germany soon began to grow into the game, though, and it wasn't long before they created their first opening when Emre Can's cross was met by Thomas Muller, but the forward could only turn his shot a few yards wide of the far post.
Hugo Lloris was called into action for the first time just a minute later when Can's scuffed effort almost bounced into the bottom corner before being parried away by the France skipper.
Germany, appearing in a record eighth European Championship semi-final, began to gain complete control of the contest having weathered the early storm and again Lloris was called into action soon after, although this was a more routine stop from Muller's long-range strike.
The pressure on France's defence continued to grow and, having survived a penalty appeal for a Paul Pogba challenge on Toni Kroos, Bastian Schweinsteiger drew another stop from Lloris with an effort from 25 yards.
Neuer was forced into a couple of routine stops from free kicks, but it was the world champions who continued to look the most likely to score and it took a last-gasp interception from Samuel Umtiti to deny Muller after Julian Draxler had poked the ball into a dangerous area.
On the rare occasions France did gain possession, they often wasted it, and Matuidi gifted Germany another shooting opportunity by giving the ball straight to Muller, but the isolated frontman was forced to go for goal from range and Lloris got down to keep it out.
The hosts did begin to get themselves back into the match towards the end of the half, maintaining a threat on the break, and soon after Griezmann had slammed one effort into the side-netting from a tight angle they had a clear chance to break the deadlock.
Olivier Giroud contested a header on the halfway line and the ball broke in his favour to send him clean through on goal, but the Arsenal man lacked the pace to race clear and Benedikt Howedes got back in time to make a vital challenge.
Despite spending the vast majority of the opening 45 minutes on the back foot, France did go into the break ahead courtesy of a penalty in first-half stoppage time when Schweinsteiger, appearing in a record 38th match at a major international tournament, was adjudged to have handled the ball when blocking a header from Patrice Evra.
Griezmann stepped up to take the spot kick, and the top scorer at Euro 2016 confidently stroked the ball home, sending Neuer the wrong way to register his fifth goal at the tournament.
The last time Germany won a match after being 1-0 down at half time was in 2003, against France, and it was Les Bleus who made the brighter start to the second half too, with Giroud collecting the ball in space before seeing his effort blocked by Jerome Boateng.
France had not beaten Germany in a major tournament for 58 years, but they took another giant step towards ending that barren spell with less than 20 minutes remaining when Griezmann doubled his personal tally for the night.
Joshua Kimmich was caught in possession inside his own area, and Pogba lifted a cross into the box which Neuer could only palm into the path of Griezmann, who stabbed it home to become just the second player in European Championships history to score more than five goals in a single finals, after Michel Platini.
Germany immediately went in search of a goal back, and Kimmich was inches away from atoning for his earlier error when he sent a curling effort towards the top corner, only to see it clip the post on its way behind.
Draxler was the next to come close with a free kick that whistled a yard or so past the post, before Leroy Sane almost scored just seconds after coming on as a sub when a free kick dropped to him and bounced narrowly wide of the target.
A corner was awarded, and from the resulting delivery the ball fell to Shkodran Mustafi in a promising position, but the defender lacked composure and lashed his finish a long way over the crossbar.
It continued to be set pieces which provided Germany with their best chances, but another one went begging when Kroos's delivery was powered narrowly over by Howedes with less than 10 minutes remaining.
Griezmann had the chance to write his name into French folklore by sealing things with a hat-trick when he broke clear down the left flank late on, but he didn't catch his effort right and Neuer made a comfortable stop.
Germany had one final throw of the dice in the third of four minutes stoppage time, but Kimmich's firm header was kept out by a fine reaction stop from Lloris as France saw out the win to reach a record second European Championship final on home soil.
Les Bleus are unbeaten in their last 10 meetings with Portugal heading into Sunday's showpiece in Saint-Denis.