Cesc Fabregas scored the winning penalty past midnight at the Donbass Arena in Donetsk, Ukraine. The match finished 0-0 after regulation play and 30 minutes of extra time.
Spain will meet record three-time champion Germany or Italy in the July 1 final. Those countries meet today in Warsaw.
“It was a very even match,” Spain coach Vicente del Bosque said on the website of tournament organizer UEFA. “It wasn’t easy to get through their defense. The players have played so many matches and they have to show their best in one more.”
Portugal, the runner-up to Greece in 2004, remains without a major title.
“We feel a great sadness,” said Portugal forward Nelson Oliveira, whose team didn’t have a shot on target after halftime. “At the same time we can hold our heads high, because we’re dignified in our defeat. We did everything we could to win.”
Bruno Alves hit the crossbar for Portugal and Fabregas sent his kick in off the left post past Rui Patricio to make Spain, which is also world champion, the first team since Germany in the 1970s to reach three straight finals between the European Championship and World Cup.
“Being in another final is a miracle,” Fabregas said. “It’s very emotional.”
Del Bosque made a surprise change to his lineup with Alvaro Negredo starting at striker. Del Bosque began two of the first four games without a recognized forward, with Fernando Torres getting the nod in the others.
Portugal opened on the offensive as Miguel Veloso’s corner kick was tipped over the bar by Spanish goalkeeper Iker Casillas in the second minute.
Spain’s Alvaro Arbeloa and Iniesta missed with shots, while Casillas came off his line to beat Nani to a cross from Cristiano Ronaldo, who also shot over the goal.
After Portugal had a penalty claim for handball against Ramos turned down in the 28th minute, Iniesta curled a shot over the goal and Ronaldo sent the final chance of the half wide.
Del Bosque brought on Fabregas, who has two goals in the tournament, in the 54th minute for Negredo. Portugal’s Hugo Almeida then shot over and sent another effort wide.
Spain finally put an attempt on target in the 68th minute as Xavi Hernandez’s shot from outside the area went straight to Patricio. Almeida then fired wide from an angle after being released down the left.
Ronaldo sent a free kick over the crossbar and Fabregas did the same with a shot from the edge of the area. Ronaldo had another free kick from 25 yards (23 meters) out with six minutes left, but once again put it over the goal.
Portugal broke out on a counter attack in the 90th minute but Ronaldo shot well over from inside the area and the game went to extra time.
Spain dominated possession in extra time and was twice denied by Patricio, who stopped Iniesta’s shot from six yards out in the 96th minute and dropped to save Jesus Navas’s shot with nine minutes left.
Spain had a late chance as Pedro Rodriguez was sent free by Fabregas, only to have defender Fabio Coentrao recover to clear the ball away for a corner.
Xabi Alonso and Joao Moutinho failed with the opening kicks of the shootout before the next five were scored. Then Alves was unable to convert and Fabregas held his nerve to put Spain into the final.
“If I had to choose a way of losing I wouldn’t choose this one,” Portugal coach Paulo Bento said. “Spain are a great team.”
To contact the reporter on this story: Bob Bensch in London at email@example.com.