Excellent catch. This looks like a bug; as you might've guessed, we
don't yet use client side authentication with STARTTLS, and this code
was only tested a few times when it was first inserted.
I'll apply the patch you suggest.
The dn mapping is an open problem across multiple protocols and
authorization modules and it's a good question what to do here and the
easiest way to configure it. Doing it right may involve an LDAP query
to map dn to username.
Thanks,
Larry
Date: Thu, 15 Mar 2001 16:17:21 +0100
From: Norbert Klasen <[EMAIL PROTECTED]>
Organization: DFN Directory Services, ZDV Uni Tübingen
Hi,
if imtest is called with a client certificate (and the local ca cert has
been specified with tls_ca_file in /etc/imapd.conf) the imapd_userid
variable is set cmd_starttls() to external.auth_id, which is set in
tls_start_servertls to the CN part of the subject in the client cert.
From the logfile it appears as if the user is now authenticated:
imapd[26078]: starttls: TLSv1 with cipher DES-CBC3-SHA (168/168 bits)
authenticated as peerCN
However, since imapd_authstate does not get set, the user still has no
more rights than anonymous. Furthermore any attempts to AUTHENTICATE
fail with "BAD Already authenticated" because cmdloop() asserts that
imapd_userid is NOT set.
If the assignment to imapd_userid is removed, SASL EXTERNAL works:
--- imapd.c.orig Thu Mar 15 15:47:15 2001
+++ imapd.c Thu Mar 15 15:56:28 2001
@@ -4095,11 +4095,6 @@
fatal("sasl_setprop() failed: cmd_starttls()", EC_TEMPFAIL);
}
- /* if authenticated set that */
- if (external.auth_id != NULL) {
- imapd_userid = external.auth_id;
- }
-
/* tell the prot layer about our new layers */
prot_settls(imapd_in, tls_conn);
prot_settls(imapd_out, tls_conn);
> imtest -t mycert.pem -u "" -m EXTERNAL server
C: C01 CAPABILITY
S: * OK server Cyrus IMAP4 v2.0.12 server ready
S: * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ NAMESPACE UIDPLUS ID
NO_ATOMIC_RENAME UNSELECT MULTIAPPEND SORT THREAD=ORDEREDSUBJECT
THREAD=REFERENCES IDLE STARTTLS AUTH=GSSAPI X-NETSCAPE
S: C01 OK Completed
S01 OK Begin TLS negotiation now
verify error:num=19:self signed certificate in certificate chain
TLS connection established: TLSv1 with cipher DES-CBC3-SHA (168/168
bits)
C: C01 CAPABILITY
S: * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ NAMESPACE UIDPLUS ID
NO_ATOMIC_RENAME UNSELECT MULTIAPPEND SORT THREAD=ORDEREDSUBJECT
THREAD=REFERENCES IDLE STARTTLS AUTH=LOGIN AUTH=PLAIN AUTH=GSSAPI
AUTH=EXTERNAL X-NETSCAPE
S: C01 OK Completed
C: A01 AUTHENTICATE EXTERNAL
S: +
C:
S: A01 OK Success (tls protection)
Authenticated.
Security strength factor: 0
1 select inbox
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
[..]
This requires that the CN in the cert is a valid imapd_userid and that
the authorization id is empty. A non empty authorization id does not
work; even if its the same as the CN.
The right thing to do would probably be to set external.auth_id to the
client's cert full subject DN and let the EXTERNAL mechanism handle the
mapping/proxying to an authorization id (by means of admin policy,
regexp or directory lookup).