Germany shocked defending men's ice hockey champions Canada 4-3, beating the Canadian men on Olympic ice for the first time to reach their first gold medal game.

The Germans, who knocked out Sweden in the quarters, relied on a scrappy defence and opportunistic offence to squeeze past a Canadian team who had looked on course for a third straight Olympic final appearance even without their NHL players.

The win set up a gold medal game against the mighty Russians, who beat the Czech Republic 3-0 in Friday's first semi-final.

"It's unreal to get to play for gold," German defenceman Frank Hordler said.

"It gives me goosebumps," said forward Patrick Hager, who scored what would prove to be the game-winner.

It was a day of sporting ignominy for hockey-mad Canada, winners of the last two Olympic gold medals in men's ice hockey.

The Canadian men's curling team were earlier shut out of the Olympic medals for the first time.

"A lot of guys have scars today," Canadian forward Maxim Noreau said.

Germany built a 4-1 lead through the first two periods only to face a withering Canadian comeback in the third as they scored two goals in the first 10 minutes of the period.

But Canada fell one goal short despite peppering German goaltender Danny Aus den Birken with a barrage of shots until time ran out.