The race was NASCAR's third Cup Series event since its season returned from a suspension due to the coronavirus pandemic. No fans were allowed at the 1.5-mile track for NASCAR's longest race.
"I wanted to win the 600 my whole life," Keselowski told reporters. "I wish it was in front of everybody. I recognize that's not always how it works.
"I'm just thankful for the win. I'm trying not to get too caught up in all the peripherals. But it would have been nice to have my family and the fans here ... I wish they could have been in victory lane with me."
Keselowski qualified for the No. 9 position but was forced to start in the back of the field due to an unapproved part on his car before he claimed his first victory in the event.
Alex Bowman won the first two stages but finished 20th. Johnson finished second but was later disqualified because his car failed a post-race inspection. Chase Elliott finished third, followed by Ryan Blaney, Kyle Busch and Kevin Harvick.
Bowman led a race-high 164 laps.
Keselowski and Johnson broke away from the pack on the final restart after a wreck on lap 399. Most of the cars went into the pits but Keselowski, Johnson and six other cars chose to remain on the track. The move paid off as Keselowski held off Johnson to claim the checkered flag.
Cup Series drivers will return to the track for the Alsco Uniforms 500 at 8 p.m. EDT Wednesday in Charlotte.