I had this problem too. I had to do a few things to solve it. I was really disappointed that no one posted a solution, so I will do just that.
One, since /opt/zimbra is owned by root, yet sa-update should be run as the zimbra user, I had to do the following as root:
chown zimbra:zimbra /opt/zimbra/.gnupg
chmod 700 /opt/zimbra/.gnupg
chown zimbra:zimbra /opt/zimbra/.spamassassin
Two, sa-update still tried to create the .gnupg directory unless I specified the parameter manually with " --gpghomedir /opt/zimbra/.gnupg".
Three, I had to edit the sa-update script thus:
my $DEF_RULES_DIR = '/opt/zimbra/conf/spamassassin';
my $LOCAL_RULES_DIR = '/opt/zimbra/conf/spamassassin';
# my $LOCAL_RULES_DIR = '/etc/mail/spamassassin';
You can see I commented out the default LOCAL_RULES_DIR definition and replaced it with the value for DEF_RULES_DIR.
Four, in addition to the change above, I had to specify the parameter "--updatedir /opt/zimbra/conf/spamassassin". So the command I used was:
./sa-update --gpghomedir /opt/zimbra/.gnupg --updatedir /opt/zimbra/conf/spamassassin
You can also pass "-D" to sa-update to put it into debug mode. That makes it a lot easier to fix any problems.