The Swiss took an early lead through Mario Gavranovic and Remo Freuler added a second before goals from Timo Werner and Kai Havertz levelled the scores. Gavranovic then grabbed his second only for Serge Gnabry to earn Germany a point.
The result moves Germany within a point of League A Group Four leaders Spain, who remain on seven points after losing 1-0 away to a Ukraine side now on six points, while the Swiss, still without a win, stay bottom with two points.
Germany coach Joachim Loew reverted to a four-man defence for the game in an empty stadium, after they had led in the last four games only to concede equalisers in three of them.
But it remained their weak spot on Tuesday as they struggled with quick breaks from the Swiss who found far too much space.
"It was extremely intense. We started badly but showed great attitude in coming back," Loew said. "That was positive. In defence we made our share of mistakes which we have to stop. But we showed that the team is ready to fight."
The Swiss had stunned Germany with Gavranovic's fifth minute header and doubled the lead in the 26th when they intercepted a pass from Toni Kroos, playing in his 100th international, and Freuler beat goalkeeper Manuel Neuer with a cool chip.
Werner hit back for the hosts two minutes later, wrongfooting keeper Yann Sommer with a clever low shot, as the Germans maintained possession and kept pushing forward.
Robin Gosens' effort was tipped over the bar by Sommer late in the first half but the keeper was beaten when Havertz charged into the box and fired in the equaliser in the 55th.
But Germany's backline kept leaking goals as the Swiss went back in front in the 57th. Neuer made consecutive saves from Haris Seferovic but Gavranovic drilled in on the rebound.
A sensational Gnabry back heel flick on the hour pulled the home side level once more and rescued a point for Loew's team.
"We have to defend better, defend more intelligently and smarter," Havertz said. "But we kept coming back, we showed a strong mentality. We need more patience but today there were lots of good signs. We will keep working at it."
The Swiss finished with 10 men following the stoppage-time dismissal of defender Fabian Schaer for a second booking.