PITTSBURGH -- The Pittsburgh Steelers are getting the breaks when it comes to opposing quarterbacks this season.
Keenum got the call over Sam Bradford, who developed swelling in his knee during the week and was ruled out after a brief pregame workout.
The Steelers recorded only two sacks, but consistently pressured Keenum, the fifth-year veteran who completed 20 of 37 passes for 167 yards without an interception.
"Somebody told me this morning, but I wasn't really thinking about it," said Steelers linebacker Ryan Shazier. "I was in here getting taped and they said 'Hey, Bradford's not playing.' I said, 'All right, cool, I understand.' Case Keenum has started before in the league and is a good quarterback."
But it didn't set off any celebrations in the Steelers' locker room.
"We're playing whoever's out there," Shazier said. "If we're playing against the best quarterback in the league or the worst quarterback in the league, we really don't care. We just want to go with the plan we have and do the best we can."
The Steelers' plan was to shut down a Vikings' run game that averaged 4.3 yards per carry in the opener, and the Steelers succeeded, holding the Vikings to just 91 yards on 20 carries.
"Just?" said Cam Heyward. "That's too much, especially when we had them at 25 yards (at halftime). They're a good offense, a good running game with three really good backs, but we have to hold ourselves to a higher standard."
The defense carried a sluggish offense until quarterback Ben Roethlisberger got warmed up.
On an emotional day for Heinz Field fans honoring the memory of the late owner Dan Rooney, Roethlisberger charged to midfield carrying a DMR flag upon his introduction and said he had tears in his eyes during the playing of the national anthem.
"I had to snap out of it," said Roethlisberger. "The whole day was very emotional."
Roethlisberger completed 23 of 35 passes for 243 yards and two touchdowns, both in the first half.
Roethlisberger threw a 27-yard touchdown pass to Martavis Bryant to cap the Steelers' second possession. The drive was aided by Vikings defensive end Bryan Robison, who jumped offside on fourth-and-1 from the Pittsburgh 31 during what appeared to be a bluff by Roethlisberger.
Bryant found separation from cornerback Terence Newman on the crossing pattern for the first-quarter score.
Roethlisberger then found JuJu Smith-Schuster for the rookie's first career touchdown catch, a 4-yard shovel pass early in the second quarter for a touchdown and 14-0 Steelers lead.
The score was set up by a 49-yard pass interference call against Vikings cornerback Trae Waynes, who tackled Bryant at the Minnesota 12 on a second-and-22 bomb from Roethlisberger.
The Vikings answered with a 42-yard Kai Forbath field goal to cut the deficit to 14-3 by halftime.
The Vikings attempted a fake punt from their own side of the field early in the second half, but Tyler Matakevich broke up Ryan Quigley's pass to Blake Bell, and Chris Boswell kicked a 46-yard field goal for a 17-3 Steelers lead.
Dalvin Cook, who had been held to 3 yards on six first-half carries, put the Vikings back in the game with a 25-yard run to the Pittsburgh 1, from where fullback C.J. Ham scored. A missed extra point by Forbath kept the Vikings behind by 17-9.
The Steelers stretched the lead to 20-9 on a 29-yard field goal by Boswell with 5:05 left in the third quarter. It was set up by a 51-yard catch by Bryant, who finished with three catches for 91 yards.
Boswell kicked a 37-yard field goal with 3:18 left and a 43-yarder with 1:53 left to cement the win for the Steelers (2-0).
Roethlisberger, who called the Vikings "one of the best defenses I've seen in a long time," finished with a passer rating of 104.8.
"Early in the week we saw what kind of coverage they were going to be in," Roethlisberger said of the Vikings' man-to-man coverage with a single-high safety.
"Even quarters," he added. "The safeties don't get a lot of depth a lot of times so it gave us opportunities. What they do is they get a pass rush. They create the ball coming out of your hands quick. They gave us looks we could've taken advantage of, which we did. We got two big pass interference plays and Martavis caught another one. We made some things happen but that rush was really good. They got in there and made me throw it early sometimes."
Le'Veon Bell carried 27 times for 87 yards, or just four yards less than the Vikings gained as a team.
"It's extremely frustrating, because we know how good we can be," said Vikings receiver Adam Thielen. "And we did not prove it today. We are going to be frustrated, but tomorrow we are going back to work, watch film and get better. We have to remember it's only Game 2. It's still really early in the season. It's always about how you respond to bad games."
NOTES: With TE Vance McDonald inactive, OT Chris Hubbard started at tight end for the Steelers in a jumbo package, and later played both tackle positions in relief. ... The start by QB Case Keenum was the 25th of his five-year career, but first with the Vikings. ... WR Martavis Bryant's touchdown was his first since Jan. 9, 2016, in a playoff game against Cincinnati. ... Steelers rookie OLB T.J. Watt left in the second quarter with a groin injury. ... The touchdown run by RB C.J. Ham came on his first career carry. ... DE Everson Griffen had both of the Vikings' sacks.