The Eredivisie champions took a shock 2-0 half-time lead at the Amsterdam ArenA as both Thulani Serero and Danny Hoesen netted their first European goals.
Xavi scored a penalty after Veltman was sent off for a foul on Neymar early in the second period, but the hosts withstood fierce pressure through the remainder of the game.
The result, coupled with Milan's 3-0 success at Celtic in the other game in the pool, means the December 11 clash between the Rossoneri and Ajax will determine who qualifies alongside Barca for the last 16.
"This was a matter of battling, but also of quality," De Boer said. "I said that we wanted to play our own game, and my players did that.
"We applied pressure and tried to play football. I think Barcelona did not expect that. It's a pity we ended with 10 man. The players and the fans fought to hold on to 2-1."
Ricardo van Rhijn's under-hit back-pass three minutes after the interval led to last man Veltman bringing down Neymar and, after the right-back was sent off, Xavi converted from 12 yards.
"It starts with that back-pass from Ricardo," De Boer said. "But, after that, Joel must rely on his goalkeeper. (Former Ajax and Holland coach) Louis van Gaal used to say to us, 'please note, we have (former Ajax and Holland goalkeeper) Edwin van der Sar yet'.
"This is an expensive lesson for Veltman, because now he will not play against Milan. That was the only blemish (on the pitch) tonight."
An Ajax fan was taken to hospital after suffering "serious head injuries" towards the end of the first half. He fell around five metres from the stand behind the goal into the moat around the pitch.