On Tue, Nov 09, 2021 at 05:30:33PM +0100, Martin Kletzander wrote:
This setting was unsafe for a number of reasons, so bear with me
here.
In the Distinguished Name (or rather the string representation of ASN.1
RelativeDistinguishedName if you will) the individial fields (or rather each
AttributeTypeAndValue) can be in any order as defined in RFC4514, section 2.2.
The function we use to get the DN is gnutls_x509_crt_get_dn(3) which claims to
return the DN as described in the aforementioned RFC.
The help we are providing to the user when no DN from the list of allowed DNs
matches an incoming TLS connection says to check the output of certtool,
particularly `certtool -i --infile clientcert.pem`. However in the output of
that command the order of the fields changed in some previous version exposing
the inconsistency (see bugzilla link below for more details).
This is one reason why we should not depend on the order of the fields being
stable as the same change can happen (and maybe already happened) with the
gnutls_x509_crt_get_dn(3) function.
gnutls_x509_crt_get_dn() hasn't changed behaviour recently.
Back in 2016 it was accidentally changed, but they quickly
fixed that mistake, and introduced a newer
gnutls_x509_crt_get_dn3() which is what certtool -i uses
and reports in the opposite order.
What changed recently is the order in which fields are
written into the created certificate by certtool.
This is fine, libvirt's tls_allowed_dn_list setting
has to be configured to match the order of the fields
in the certificates you're actually using.
The primary bug here from libvirt's POV, is that we're
incorrectly telling people to use the order reported by
"certtool -i". We need to tell them to use the *reverse*
of what certtool -i reports.
Or we could possibly add a 'tls_allowed_dn_list_revere = bool'
setting to make ordering configurable.
I put more details into the bug
https://bugzilla.redhat.com/show_bug.cgi?id=2018488#c3
showing tests to demonstrate the behaviour across gnutls
versions.
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|