Well I seem to have it working too but it appears the following are important:
1. Create a DNS SRV record for your domain for CardDAV (for auto-discovery), e.g.:
The first part _carddav._tcp. will always be the same, then add your (sub)domain after.
;; ANSWER SECTION:
_carddav._tcp.mail.domain.net. 14400 IN SRV 10 10 443 mail.domain.net.
TTL is 14400.
IN SRV for an SRV record.
10 and 10 are the priority and weight (like in an MX record with weight being like a sub-priority).
443 is the port.
mail.domain.net. is the CardDAV server URL.
2. Create a new folder for your contacts in the root directory, e.g. I called mine 'iPhone' at the same level as the existing 'Emailed Contacts' and 'Contacts' folders.
I had trouble when using the existing folders as it only sync'd one-way and contacts created via Zimbra webmail would not sync at all. So far, syncing and creating contacts in the 'iPhone' folder works both ways.
When configuring the iPhone 4 for CardDAV, I add the port to the server address as i'm using a non-standard port (not 443), e.g. mail.domain.net:40443.
The iPhone 4 is quite happy with a username containing the '@' symbol whereas the Apple Address Book is not. To get around this I had to add a Virtual Host to the domain configuration so I could drop the '@domain.net' part of the username - now Apple Address Book works to the point where it's happy with the credentials but I don't see ANY contacts or folders... oh well...
Info came from here: Using dnsmasq to add SRV records for CardDAV and CalDAV | andrew.mcmillan.net.nz
Hope that helps.