Andrey Galabinov had a chance to pull one back from the spot in stoppage time, but Wojciech Szczesny dived the right way to thwart his feeble effort.
Nevertheless, Spezia can be proud of their performance; they showed great character and resilience at the home of the champions. But the defeat brings them closer to the relegation zone.
Juventus, meanwhile, remain third in the standings and face another potential banana skin at the weekend against Lazio. On that note, here are the Juventus player ratings:
Wojciech Szczesny - 7/10
The Juventus custodian wasn't tested all night, but Wojciech Szczesny stepped up to the plate, saving Andrey Galabinov's penalty in stoppage-time to preserve his clean sheet.
Danilo - 6/10
With the Bianconeri pushing Spezia on the backfoot with high pressing, Danilo had the freedom to drive upfield and link up with the attackers. But his end product was missing on the night.
Merih Demiral - 7/10
The Turkish centre-back held his ground well for most of the match but left the field on a sour note after conceding a late penalty for a heavy challenge on Emmanuel Gyasi.
Alex Sandro - 7/10
Operating from the heart of Juventus' defence, the Brazilian was excellent, marshalling the backline with authority. He won three aerial duels, completed two tackles and made a game-high five clearances.
Gianluca Frabotta - 5/10
Gianluca Frabotta got a rare start after Matthijs de Ligt went off injured in the warm-up. But he ended up squandering the opportunity to make an impression. He also went into the books for a dangerous foul on Estevez and will now miss the clash with Lazio at the weekend.
Federico Chiesa - 7/10
Back in form against Spezia, Federico Chiesa was the main man in the attack for Juventus for a good 60 minutes. He put the icing on the cake with his first league goal in over a month, his seventh of the season.
Rodrigo Betancur - 6/10
Rodrigo Bentancur has often faced sharp criticisms for a series of disappointing performances. Things were no different against Spezia too.
He failed to complete any of his four attempted tackles and was also dribbled past four times, more than any player in the game. However, the Uruguayan salvaged some pride by assisting Cristiano Ronaldo for Juventus' third goal on the night.
Adrien Rabiot - 5/10
Adrien Rabiot had a lacklustre showing against the Serie A minnows. The Frenchman was gassed in the midfield by Spezia in the first half and was also dispossessed twice.
Weston McKennie - 5/10
The young American star had another stinker, failing to muster a single effort on goal. It was not surprising to see Weston McKennie become the first player to be taken off for Juventus on the night.
Dejan Kulusevski - 5/10
Time is running out for the young Swedish gun to prove his worth for Juventus, as he capped off another disappointing performance against Spezia. Dejan Kulsevski also offered precious little attacking-wise.
Cristiano Ronaldo - 7/10
It was turning out to be a frustrating night for the talismanic No.7, who tried his hardest but couldn't find the back of the net. However, it all changed for him in the 89th minute when Ronaldo capped off a smooth counter-attacking move with a sublime finish for his 20th goal of the campaign.
The Portuguese ace has now become the first player in the history of the game to net at least 20 league goals in 12 successive campaigns (nine for Real Madrid, three for Juventus).
Ratings of Juventus Substitutes
Alvaro Morata - 7/10
It took Alvaro Morata just one minute to make an impact after coming off the bench, tapping home from close range to break the deadlock for Juventus.
Federico Bernardeschi - 8/10
Federico Bernardeschi was in inspired form against Spezia, making some excellent crosses and creating both Juventus goals.
Aaron Ramsey - 5/10
Aaron Ramsey made little impact for Juventus after coming off the bench in the second half.
Alessandro Di Pardo - N/A
Too little time for the Juventus youngster to make an impact.