The Canadians go against unbeaten Slovakia and the United States plays Sweden in the semis Saturday.
Canada's Dany Heatley, a center from the NHL's Atlanta Thrashers, scored two goals, including the game-winner from near the blue line.
Finland regained the lead on a goal by Ollie Jokinen in the second period, but Canada tied it at 3-3 with less than a minute remaining in the period on a shot by defenseman Eric Brewer.
Each team scored again in the third, Finland when Canada's goaltender, Robert Luongo, accidentally kicked the puck into his own net after a shot by Kimmo Rintanen, and Canada on a shot by Steve Staios.
Dennis Rodman pledges to end trips to North Korea
Senate Democrats to pull all-nighter on climate change