Cresciuto nel VV Schoten, a 15 anni passa all'Ajax. Con lo Jong Ajax riesce ad arrivare sino alle semifinali della Coppa d'Olanda venendo eliminati ai rigori dall'Utrecht. Fa il suo debutto ufficiale nel club di Amsterdam allenato da Ronald Koeman l'11 agosto 2002 nella Johan Cruijff Schaal vinta per 3-1 contro il PSV Eindhoven, sostituendo i colleghi di reparto Joey Didulica e Bogdan Lobonț. La settimana dopo, il 18 agosto, debutta anche in campionato contro l'Utrecht. Alla sua prima stagione colleziona 9 presenze come terzo portiere.
Al secondo anno colleziona 10 presenze, vincendo il campionato. Durante il ritiro estivo del 2004 l'allenatore Ronald Koeman lo nomina portiere titolare ma già a settembre Bogdan Lobonț è costretto a subentrargli per un infortunio. In totale in quest'annata Stekelenburg è presente per 11 volte.
L'anno seguente torna titolare con Danny Blind ma un ulteriore infortunio rimediato nell'amichevole contro il Boca Juniors lo tiene lontano dai campi fino al 15 ottobre, quando torna a giocare contro l'Heracles Almelo. Il 26 gennaio rinnova il contratto, in scadenza nel 2008, fino al 2010. Il 7 maggio 2006 vince la Coppa d'Olanda per 2-1 contro il PSV.
Dal 2006 al 2008 è titolare con gli allenatori Henk ten Cate e Adrie Koster; l'anno dopo, a causa di un nuovo infortunio, gli subentra Kenneth Vermeer per quasi tutta la stagione sotto la guida di Marco van Basten. Torna nuovamente titolare di nuovo con Martin Jol nel 2009-2010, rinnovando il suo contratto fino al 2012, e poi anche con Frank de Boer nel 2011. Il 12 marzo 2011 si è fratturato il pollice della mano sinistra durante un allenamento, mentre il 15 maggio 2011 festeggia la vittoria del suo secondo campionato con l'Ajax.
Roma
Il 1º agosto 2011 la Roma ufficializza l'acquisto di Stekelenburg, versando nelle casse dell'Ajax circa sette milioni di euro. Il portiere diventa il primo olandese della storia a vestire la maglia della Roma.[2] Fa il suo esordio con i giallorossi il 18 agosto seguente, nella partita di andata dei preliminari di Europa League persa per 0-1 sul campo dello Slovan Bratislava.[3] L'11 settembre gioca la prima partita di campionato, nella sconfitta contro il Cagliari per 1-2 all'Olimpico. Il 17 settembre, nella sfida a San Siro contro l'Inter, esce in barella dopo uno scontro con il difensore nerazzurro Lucio. Torna in campo il 16 ottobre, in occasione del Derby di Roma perso dai giallorossi per 1-2. Termina la sua prima annata in Italia collezionando 33 presenze tra campionato e coppe, subendo 45 gol.
Nella stagione 2012-2013, che vede l'arrivo di Zdeněk Zeman sulla panchina della Roma, Stekelenburg viene relegato al ruolo di riserva, alle spalle del nuovo acquisto Mauro Goicoechea. Nel mese di gennaio l'olandese viene messo sul mercato e trova un accordo con il Fulham, ma la trattativa tra la squadra capitolina e il club inglese salta all'ultimo momento. Dopo l'esonero di Zeman e i numerosi errori di Goicoechea, Stekelenburg ritorna ad essere schierato come titolare. Torna a giocare il 16 febbraio, in occasione della partita persa sul campo della Sampdoria per 1-3.
Fulham
Il 5 giugno 2013 firma un contratto quadriennale con il Fulham, che lo acquista dalla Roma per circa sei milioni di euro.[4] Il 17 agosto seguente fa il suo esordio con la nuova maglia, nella partita vinta per 1-0 contro il Sunderland, ma è costretto ad uscire dal campo al 76º minuto di gioco a causa di un infortunio alla spalla. Torna a giocare il 21 ottobre, nella vittoria per 4-1 sul campo del Crystal Palace. A fine stagione il Fulham, penultimo in campionato, retrocede in Football League Championship.
Monaco
Il 9 agosto 2014 si trasferisce ai francesi del Monaco con la formula del prestito con diritto di riscatto.[5] Con la squadra del Principato disputa solamente una partita di campionato, il 22 marzo 2015 contro il Reims (3-1), mentre è titolare in Coupe de France e Coupe de la Ligue. A fine stagione il Monaco decide di non riscattarlo ed il giocatore fa quindi ritorno al Fulham.
Southampton
Il 22 giugno 2015 passa in prestito al Southampton.[6] Qui ritrova Ronald Koeman, suo allenatore all'Ajax tra il 2001 e il 2005. In totale disputa 20 partite tra campionato e coppe, subendo 26 gol.
Everton
Il 1º luglio 2016 viene acquistato dall'Everton, con cui firma un contratto triennale; anche in questa occasione segue Ronald Koeman, nominato nel frattempo allenatore del club di Liverpool.[7] Il 13 agosto debutta con la nuova maglia, nella partita pareggiata per 1-1 contro il Tottenham a Goodison Park. Gioca 19 partite in Premier per poi non mettere più piede in campo dalla stagione 2017-2018 tranne che per due partite di League Cup del 2018-2019.
Ritorno all'Ajax
Nell’estate del 2020, dopo nove anni, torna all’Ajax firmando un contratto annuale.[8] Torna in campo con i lancieri nella trasferta contro l'AZ Alkmaar (0-1) del 20 gennaio 2021, gara valida per gli ottavi di Coppa d'Olanda. Arrivato per ricoprire il ruolo di secondo portiere, gioca da titolare a partire dal 10 febbraio per via della squalifica per doping di André Onana, diventando a 38 anni il più anziano giocatore ad aver indossato la casacca biancorossa.[9] Il 18 aprile vince la Coppa d’Olanda contro il Vitesse e il 2 maggio la sua quarta Eredivisie nel giorno della partita numero 300 con l’Ajax. Il 12 maggio prolunga poi il proprio contratto con l’Ajax fino al 2022[10] giocando da capitano il giorno seguente il match vinto per 3-1 contro il VVV-Venlo. Ad ottobre annuncia di doversi operare all'anca per risolvere i problemi all'inguine; ritorna in campo a fine aprile e in questa stagione raccoglie quindi solo sette presenze.[11] Il 24 giugno 2022 rinnova con l’Ajax per un altro anno.[12]
Stekelenburg si ritira al termine della stagione 2022-2023, nella quale ha ricoperto il ruolo di terzo portiere dei lancieri senza mai giocare.[13]
Nazionale
Il 3 settembre 2004 fa il suo debutto internazionale con la maglia della nazionale olandese nella partita contro il Liechtenstein, terminato 3-0. È stato convocato dal CTMarco van Basten nella rosa degli oranje che ha disputato i Mondiali 2006 in Germania, senza scendere mai in campo durante la competizione.
È stato poi nuovamente tra i 23 convocati della nazionale olandese di Marco van Basten, questa volta per Euro 2008 e successivamente, dopo il ritiro internazionale di Edwin van der Sar, è diventato il portiere titolare. È stato titolare anche nel Mondiale 2010 in Sudafrica,[14] durante il quale la squadra raggiunge la finale e si classifica al secondo posto.
Viene convocato ad Euro 2012, dove gioca le prime tre gare con la sua nazionale che viene eliminata nella fase a gironi. Non selezionato dal CT van Gaal, per il Mondiale 2014 in Brasile, Stekelenburg torna in nazionale il 7 ottobre 2016, nella gara vinta per 4-1 ai danni della Bielorussia valida per le qualificazioni ai Mondiali 2018, giocando poi altre tre gare tra ottobre e novembre.
Torna tra i convocati della nazionale nel marzo 2021 (dopo cinque anni di assenza) in vista delle gare di qualificazione al Mondiale 2022[15] venendo poi convocato all’Europeo di giugno, in cui risulta essere il calciatore più anziano della competizione.[16] Il 6 del mese stesso torna a giocare con gli oranje in occasione dell'amichevole pre-manifestazione vinta 3-0 contro la Georgia.[17] All'Europeo è titolare al posto di Jasper Cillessen (escluso perché positivo al COVID-19), diventando il giocatore più anziano ad aver indossato la maglia della nazionale olandese nella storia della competizione.[18] La manifestazione si conclude agli ottavi per gli olandesi, in cui vengono eliminati dalla Rep. Ceca.[19]
Ad agosto decide di lasciare la nazionale olandese dopo 17 anni, periodo in cui ha messo a referto 63 presenze.[20]