Canada is now guaranteed no worse than a fourth-place finish and will face Argentina in the tournament's semifinal. The top three countries will earn a berth in Rio.
The match remained scoreless through regulation time as neither the 15th-ranked Canadians or No. 7 New Zealand could get one past the opposing goalkeeper.
Adam Froese eventually scored the winning goal for Canada, but credited the victory to his keeper David Carter, who gave his country a chance to upset the higher-ranked Kiwis when he shut the door on Ryan Archibald in the 14th round of the shootout.
"Our goalkeeper Dave Carter kept us in the whole time," said Froese. "I can't express how much credit I can give to him, he just played incredible tonight during the game and in the shootout."
Gordon Johnston scored four times in the shootout for Canada, Mark Pearson found the back of the net twice while Sukhi Panesar added the other.
The Netherlands will play Germany in the other semifinal. Both matches go Saturday.