On Fri, Jul 18, 2025 at 09:24:05 +0100, Daniel P. Berrangé wrote: > On Fri, Jul 18, 2025 at 09:39:22AM +0200, Peter Krempa wrote: > > On Thu, Jul 17, 2025 at 17:02:33 +0100, Daniel P. Berrangé wrote: > > > On Thu, Jul 17, 2025 at 05:28:09PM +0200, Peter Krempa via Devel wrote: > > > > From: Peter Krempa <pkre...@redhat.com> > > > > > > > > Similarly to how we iterate the list of CAs in the concatenated bundle > > > > there's a possibility of the server/client certificates to be > > > > concatenated as well. > > > > > > > > If for some case the first certificate is okay but the further one have > > > > e.g. invalid signatures the validation code would not reject them but > > > > we'd encounter failures later when gnutls tries to use them. > > > > > > > > Iterate also the client/server certs rather than just the CAs. > > > > > > Was there some bug that motivated this change ? > > > > Yes-ish. I've abused the fact that gnutls loads everything from the file > > ... > > > > > > > > > > I'd like to keep libvirt's behaviour in sync with QEMU's > > > behaviour to the greatest extent possible. I've just been > > > finalizing changes to QEMU to cope with mutliple certs > > > in the server-cert.pem file, but the semantics there are > > > the certs are a chain of intermediate certs, all of which > > > must be valid. > > > > > > ie, currently we allow > > > > > > ca-cert.pem server-cert.pem > > > | | > > > |------+--------------------------| |---+-------| > > > > > > Root CA -> Sub CA 1 -> Sub CA 2 -> Server Cert > > > > > > but the intent is to support > > > > > > ca-cert.pem server-cert.pem > > > | | > > > |------+--| |----------------------------+-------| > > > > > > Root CA -> Sub CA 1 -> Sub CA 2 -> Server Cert > > > > > > > > > Or > > > > > > ca-cert.pem server-cert.pem > > > | | > > > |------+-------------| |---------------+-------| > > > > > > Root CA -> Sub CA 1 -> Sub CA 2 -> Server Cert > > > > ... meant to facilitate the above .... > > > > > > > > > > the rational is that these splits reflect how some CA will > > > give you your certs to begin with, and we want to allow > > > them to be used directly. > > > > > > My intent was to copy the QEMU change into libvirt once it > > > was merged in QEMU, so from that POV I'm not a fan of making > > > the some of the changes in this series. > > > > > > Beyond that I'm also working post-quantum crypto support, > > > which will require us to load multiple distinct server-cert-NNN.pem > > > files, each with an independant set of certs, which are selected > > > at runtime based on negotiated ciphers in the TLS handshake. > > > > ... in order to load certs with different (also the fancy new > > post-quantum) signature algorithms. > > To best of my knowledge that will not work. IIUC when you load > a bundle of certs into a session with gnutls_credentials_set > that is assumed to be a cert chain by GNUTLS.
Well with my test setup where I've: - created 2 CAs (one with RSA one with MLDSA sig) and concatenated them - created 4 server certs RSA+MLDSA sig both signed by each of the above CAs - created 4 client certs same as server certs. I've then concatenated all 4 server certs into one file and sequentially tested connecting with each of the 4 client certs. And (when allowing mldsa sigs for both CA and normal signing [1]) it worked (allowed connecting via TLS) for all of the 4 client certs. IIRC I've checked in one scenario that actually MLDSA sigs were used but didn't bother checking any further for any kind of security problems. > To load multiple parallel certs, with different algorithms > requires calling gnutls_credentials_set mutliple times, > providing each distinct cert chain. > > Kind of annoying since it means every app using gnutls is > guaranteed to need code changes to support PQC with > parallel offerings of algorithms. > > > Since I didn't notice that the crypto policy in fedora 42 doesn't yet > > trust some of those (e.g. mldsa65), some of the certificates I've > > concatenated weren't actually passing the checks. > > Yep, even in rawhide the PQC stuff isn't fully ready for gnutls. [1] Yes this is exactly what tripped me up originally, because MLDSA is not allowed in the gnutls policy. When I've concatenated the certs virt-pki-validate tripped up only if the mldsa signed certs were first. If I put RSA certs first it passed but any of the combination using MLDSA didn't work. > > The only place I'm aware of which has new enough gnutls is CentOS > Stream, and even then you need custom crypto-policies to enable > it fully. > > > > Thus if you're going to be fixing both of these I'll just push the > > cleanup patches. > > Yep, go ahead and push the cleanup ones > > With 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 :| >