Federer fired 12 aces and saved six of the seven break points he faced to end Kudla's 10-set winning streak in Halle. The American had three break points when he was leading 4-3 in the second set, but Federer fought back and finished the set with two successive aces.
The 25-year-old Kudla had saved 20 of 21 break points on his way to the semifinals at the grass-court tournament.
Federer, who saved two match points against Benoit Paire in the second round on Thursday, will play Roberto Bautista Agut or Borna Coric in Sunday's final as he goes for a record-extending 10th title in Halle. It will be his second final in as many weeks.
The Swiss great, who won his 18th grass-court title in Stuttgart on Sunday, is just two match wins away from matching Jimmy Connors' all-time record of 174 victories on grass.
After skipping the entire clay-court season for the second year in a row, Federer extended his grass-court winning streak to 20 matches, including Stuttgart and last year's titles in Halle and Wimbledon. The revitalized 36-year-old only had a longer streak on the surface once before, when he won 65 consecutive matches on grass between 2003 and 2008.