The game started out in Canada's favour, with MLS players Kyle Bekker and Maxim Tissot combining well to establish a strong midfield presence from the outset.
Canada were rewarded for their early dominance when Haber opened the scoring in the 11th minute.
The England-based striker rose to meet a Bekker corner and powerfully nodded in the game's only goal.
An injury suffered by starting Guatemala goalkeeper Juan Paredes at the quarter-hour mark slowed the proceedings quite a bit, eventually leading to a rare first half 'keeper substitution.
The delay seemed to affect the rest of the half, as Canada's dominance curtailed substantially and the match was much more even for the remainder of the opening 45 minutes.
The second half started out in similar fashion to the first, with the Canadians showing some good ball movement to put the Guatemalans on their heels.
And just as the Canadian dominance faded in the opening period, the game gradually became more level as the second half wore on.
The game opened up for stretches within the final 20 minutes, and Haber appeared to be denied a penalty kick after he outpaced the entire Guatemalan back line and looked to be hauled down inside the 18-yard box.
The officials waved play on, and with the Canadians still arguing the non-call, Guatemala streaked down field and got a shot past Milan Borjan - but off the post.
Substitute Marco Pappa also struck woodwork for the Guatemalans, as the Seattle Sounders midfielder nearly equalised just a few minutes from full time when he unleashed a shot from distance that rung off the crossbar.
However, the Central Americans would not get on the scoresheet, as Benito Floro's side held on for their first win of 2015.
Canada will not have much time to celebrate Friday's victory, as they face Puerto Rico in Bayamon on March 30.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.