"I know he throws really hard," Castillo said. "So I just waited for something over the plate that I can drive, and I put my best wood on it."
The Cardinals tied it with two runs in the ninth and had runners on first and second with two outs in the 10th when manager Mike Matheny decided against a pinch hitter. Rosenthal (0-1) took a called third strike in his second career at-bat and said he didn't carry any disappointment back to the mound.
"Uh no, because I mean, I'm not here to hit," Rosenthal said. "So it's easy to kind of brush it off and just go out there and try to have another shutdown inning."
Nate Schierholtz doubled for his fourth straight hit leading off the 11th and advanced on a sacrifice. Starlin Castro was intentionally walked and Ryan Kalish popped out on a bunt attempt before Castillo lined a 1-1 fastball 426 feet to left for his second homer.
"I figured he might be hunting for a fastball," Rosenthal said. "Looking at the video, I didn't get it up quite as much as I'd hoped, but he put a good swing on a good pitch.
"Not much you can do about it."
Justin Grimm (1-0) walked Matt Holliday and Matt Adams on eight pitches to start the 10th but got out of it, partly because Matheny left Pete Kozma and Tony Cruz on the bench. Grimm struck out Yadier Molina and got Shane Robinson to fly out before facing Rosenthal.
Matheny said he'd have batted Kozma with less than two outs. He also banked on another shutdown inning from Rosenthal, who needed just six pitches in the 10th.
"You've got a real good feeling he's going to bring us back in with another zero," Matheny said. "We had two shots at getting the guy in from second."
Hector Rondon finished for his first career save.
Veras hit two batters and walked another in the ninth. One run scored on a passed ball by Castillo, helping the Cardinals score twice in the inning. Matt Carpenter's bases-loaded sacrifice fly tied it at 3.
Veras has blown both his save chances and has allowed five earned runs in 3 2/3 innings with three hit batters and seven walks.
"A shaky outing," Cubs manager Rick Renteria said, "but he's still our guy."
Chicago starter Jeff Samardzija worked seven economic innings for the third straight start, exiting with a 1.29 ERA. He finally got some runs to work with, but was denied a win for the ninth straight outing since Aug. 24 at San Diego.
"You keep pitching and giving your team a chance to win," Samardzija said. "Everyone is trying to do their jobs and sometimes balls find holes, and sometimes they don't."
Ryan Sweeney's RBI single off Carlos Martinez tied it in the seventh and was the Cubs' first run in 21 innings when Samardzija starts. Anthony Rizzo's sacrifice fly off Kevin Siegrist snapped a tie in a two-run eighth.
Molina's RBI single in the second was his 10th hit in 18 career at-bats against Samardzija. He had two hits and is batting .455 (25 for 55) with three homers and 17 RBI against the Cubs the last two seasons.
Cardinals starter Joe Kelly allowed an unearned run in six innings. He faced the minimum through the first five innings with the help of two double-play balls.
The Cubs' appeal of a hit by pitch call on Allen Craig in the ninth was denied. ... Castro got a strange assist at SS in the fourth when he staggered and dropped Holliday's towering popup with a runner on first. The ball rolled directly to second baseman Emilio Bonifacio for a forceout as Kolten Wong slid back into first. ... Adam Wainwright (1-1, 1.29 ERA) faces Carlos Villanueva (1-2, 4.26) on Saturday. ... Kelly has pitched at least five innings in all 31 career starts, the longest streak by a St. Louis starter 25 or younger since 25-year-old Dizzy Dean went 35 in a row in 1935, according to STATS. ... St. Louis SS Jhonny Peralta was hitless in three at-bats before coming out in a double switch and is 2 for 31 (.063) on the season, both home runs.