Halep won in straight sets but needed two tie-breaks -- 7-6 (7/1), 7-6 (8/6) -- to edge past Germany's Julia Goerges, despite racing to a 4-0 lead in the first set.
However, the match turned out to be anything but routine for the Romanian who was forced to save two set points and break Goerges' serve in the 10th game to stay in the second set.
"I am very happy, honestly," said Halep.
"It's been a really tough match and it is always tough to play against her."
The Romanian will play Elina Svitolina in the last four on Friday.
Halep has lost her three last matches against the Ukrainian, failing to win a single set in those matches, stretching back to 2017.
Svitolina was the first player through to the semi-finals, beating Czech qualifier Karolina Muchova by contrast in easy fashion 6-4, 6-2.
"I found a way to have to beat her," said Svitolina. "I was very happy I could do it in two sets."
She was followed on court by Kerber and the world number six won 1-6, 6-2, 7-6 (7/4) in a tough and feisty encounter against another Czech, Barbora Strycova, who was given a time violation in the final set.
"In the first set I did a lot mistakes," said Kerber. "She was playing good. She was pushing the ball. She hit the balls really fast.
"In the second set, I was just trying to come back, playing point by point and trying to make less mistakes.
"And the third set it was a few up-and-downs, especially then at the end, a lot of emotions, as well. But I'm happy that I won it.
"It was a really close match, and I think just one, two points decided the match."
The German not only battled back from being a set down, she was also a break down in the second and third sets before winning through.
It will be Kerber's first semi-final since she won at Wimbledon last year.
She will play either Kiki Bertens or Elise Mertens in the last four.
The pair play later on Thursday.