The agreement includes a vesting fourth-year option worth $18.5 million, sources said.
The White Sox have been one of the most active teams this winter as they continue to make their push toward contention in the American League Central.
Keuchel, the 2015 AL Cy Young Award winner, coveted a big free-agent deal prior to the 2019 season, but he instead had to wait until after the June amateur draft -- when a team didn't have to give up a draft pick as compensation to sign him -- for the Atlanta Braves to give him a $13 million deal for the remainder of the season.
The left-hander, who turns 32 on Jan. 1, signed with the Braves on June 7 and made two minor league starts before making his 2019 debut on June 21. He went 8-8 with a 3.75 ERA in 112⅔ innings over 19 starts for the Braves before again going "back into the zoo" of free agency following the season.
"The more I waited, the more I knew playoff teams would call," Keuchel, whose agent is Scott Boras, said of his wait in 2019. "The fair pay is half of it, and that's what I didn't think I was getting in the offseason, but I wanted to play for a playoff team."
He did just that, helping the Braves reach the National League Divisional Series before falling to the St. Louis Cardinals.
While his leadership is coveted in the clubhouse, Keuchel's velocity was down last season, even after the extra two months of rest. He is known as a strong ground ball pitcher who lives at the knees and fares better when umpires are giving him the low strike.
Keuchel spent seven seasons with the Houston Astros, going to the All-Star Game twice and posting a 76-63 record with a 3.66 ERA and 1.25 WHIP.
ESPN's Keith Law contributed to this report.