Sidney Crosby scored twice in the first 1:04 of the second period to give the Penguins a 2-0 lead. Alex Ovechkin and Evgeny Kuznetsov scored for the Capitals to tie it before Bonino got the game-winner on a partial breakaway.
The Penguins were outshot 35-21, including 16-6 in the third period. Marc-Andre Fleury made six of his 33 saves in the final 3:08 to preserve the lead.
"We had lots of opportunities," Capitals coach Barry Trotz said. "We put some [83] pucks at their net tonight, they put [41] at ours. We did a lot of good things. We didn't do enough."
Crosby scored on a 2-on-1 with Jake Guentzel 12 seconds into the second period to give the lead, and again 52 seconds later on a rebound. Braden Holtby made a pad save on defenseman Olli Maatta's left-circle shot but left the puck in front, and Patric Hornqvist nudged it to Crosby in the right circle.
"It was two great plays," Crosby said. "On both [Hornqvist] gave us some loose pucks. He poked a couple pucks free and then Jake made a great pass on the 2-on-1. [Hornqvist] found me on the rebound there, so some really good looks from that."
Ovechkin made it 2-1 with 1:43 remaining in the second period, on a wrist shot from top of the left circle over Fleury's right shoulder. Kuznetsov tied the game 2-2 8:05 into the third period, taking a cross-ice pass from defenseman Matt Niskanen and shooting from the left circle.