Jesse Fleming converted the controversial penalty kick in the 76th minute to send the Canadians to the gold-medal match for the first time in team history.
For the Stars and Stripes, the loss means they will not play for the Olympic title for the second straight time after being eliminated in 2016 by Sweden.
Story of the match
The first half-chance of the match came in the third minute as the ball was played through to Christine Sinclair, but it had a little too much on it and went past the line for a goal line for a goal kick.
From a corner came the US' first opportunity as Julie Ertz got her head to the ball, but could only send it wide. The Stars and Stripes were dealt a major blow when starting goalkeeper Alyssa Naeher was hurt in a collision on the edge of the area and had to come off on the half hour.
In first-half stoppage time, Tobin Heath saw her shot blocked and Lynn Williams subsequently crossed for Alex Morgan, but her header was wide of the goal.
Despite dominating most of the possession and creating the majority of the chances, the US was having trouble finishing in the final third. Lindsey Horan was the latest to head a corner wide.
Coming on as a substitute, Megan Rapinoe swung in a free-kick that was punched away by Canadian goalkeeper Stephanie Labbe. She then had to tip away Ertz's header from the resulting corner.
After another save, this one on Christen Press, Canada found the opener after a check of VAR showed that Tierna Davidson fouled Deanne Rose just inside the area, but replays showed little to no contact.
Fleming stepped up and beat backup goalkeeper Adrianna Franch, who had replaced Naeher, despite the US netminder guessing the right way.
The Stars and Stripes nearly found a late equalizer in the 86th minute as Rapinoe crossed from the sideline and it found Carli Lloyd, whose header pinged off of the crossbar.
Canada saw out the remainder of the game and celebrated victory for just the fourth time in the last 62 matches against their neighbors from the south.
Man of the match: Jessie Fleming
In a game that lacked any real sustained periods of quality, Fleming took her chance, Canada's first of the match, as her shot didn't fool Franch, but beat her with pace.