Having failed to set the Games alight, the Canadians, one of the pre-tournament favourites, finally found their rhythm.
The goals were shared between seven players and after an early goal in the second period for a 2-1 lead, they were never troubled.
Canada will now face the United States in Sunday's final in which they will attempt to win a first Olympic hockey gold since 1952.
"We have played better and better as the tournament has gone on, just as we had hoped to," said Canada executive director Wayne Gretzky.
"We have made the final, that's an accomplishment in this field, but not the ultimate goal."
The key to the win was Canada's offensive line play, with Steve Yzerman, Mario Lemieux and Paul Kariya combining for seven points.
Yzerman set the Canadians on their way with a first period goal.
Ruslan Salei equalised before Eric Brewer scored early in the second and Kariya gave the favourites breathing space at 3-1 on 33 minutes.
Although captain Mario Lemieux failed to get his name on the scoresheet he did weigh in with two assists.
"It means a lot to all of us, to the players and to Canadians back home," Lemieux said of his team's qualification for the final.
"We are proud Canadians and hockey is our sport back home. Everybody plays and loves to watch it.
"For us to have a chance right now to do something special for our country is something we can all cherish for a long time if we win a gold medal."
Lemieux made a poor start to the Olympics, but has stood out as his sides playmaker in their last two outings, despite carrying a hip injury.
"My hip is feeling pretty good, but my only concern right now is Sunday," Lemieux added.
"I've talked all along the last couple of months that the most important thing for me was to play in the Olympics and to try to help this team achieve our goal - winning a gold medal."
Kariya's goal opened the floodgates and the Canadian pressure told.
Eric Lindros, Simon Gagne, Jarome Iginla and Scott Niedermayer scored the other goals.