Lautaro Martinez, who netted the opening goal in the first half, missed a penalty six minutes from time but in the end it did not matter as Candreva was on hand to fire a rocket past Roman Burki in the final stages.
Dortmund arrived in the Italian capital top of Group F, ahead of favourites Barcelona after two round of matches, but fell well short of expectations on Wednesday as Lucien Favre’s side struggled to keep pace with their hosts.
Martinez is in fine form following his brace against Sassuolo at the weekend and he reacted quickest after 22 minutes to score the opener on the stretch.
Chances for both sides dried up for long periods thereafter before Martinez was handed the chance to get his – and Inter’s – second from the penalty spot with less than 10 minutes remaining.
The Argentine striker took his time but saw his thunderous strike saved impressively by Dortmund goalkeeper Roman Burki.
Antonio Conte was frustrated at the opportunity being passed up but his side continued to be positive, sensing a tired Dortmund were there to be got at.
And so it proved with one minute remaining of normal time.
Thirty-two-year-old Candreva showed the pace of his younger days to lose his marker and with Martinez screaming for the ball to be rolled across the box, the winger picked out the top corner of the net to seal victory in style.
MATCH FACTS AND STATS
Inter Milan: Handanovic, Godin, de Vrij, Skriniar, Brozovic, Candreva, Gagliardini, Barella, Asamoah, Lukaku, Martinez.
Subs not used: Politano, Lazaro, Valero, Padelli, Esposito, Biraghi, Bastoni.
Goals: Martinez (22)
Borussia Dortmund: Burki, Hummels, Weigl, Witsel, Akanji, Hakimi, Delaney, Schulz, Sancho, Brandt, Hazard.
Subs not used: Zagadou, Dahoud, Gotze, Guerreiro, Piszczek, Bruun Larsen, Hitz.
Referee: Anthony Taylor (England)