Two tries from Lydia Thompson, added to by Abbie Scott and Kay Wilson, extended England's unbeaten run to eight games.
Emily Scarratt added seven points with the boot for the Red Roses.
"We're a little bit frustrated but at the same time I'm really proud of the way we hung in and won the game," said head coach Simon Middleton.
Magali Harvey replied by kicking 10 points for Canada, with Carolyn McEwen and Karen Paquin crossing for tries.
Sarah Hunter returned to captain England in one of Middleton's 11 changes from the 53-10 win over Australia in Wellington on Friday.
"Test match rugby is about winning games," Hunter said. "It shows the sign of a good team to fight and get a win when not everything is going your way."
England face New Zealand next on Saturday, 17 June in Rotorua.
England
Team: Waterman; Thompson, Scarratt, M Jones, McKenna; Reed, Mason; Clark, Cokayne, Lucas; Scott, Braund; Millar-Mills, Packer, Hunter.
Replacements: Fleetwood, Cornborough, Bern, Noel-Smith, Matthews, Hunt, Mclean, Wilson.
Canada
Team: Zussman, Harvey, Thornborough, Belchos, Alarie, Tessier, Josephson; McEwen, Russell, Menin, Beukeboom, Mack, Grusnick, Paquin, Russell.
Replacements: Kirby, Kassil, DeMerchant, Nelles, Mervin, Guthrie, Waters, Rajotte.
England women made it back-to-back victories in the International Women's Rugby Series as they beat Canada 27-20 in Christchurch on Tuesday.