More intelligent path finding
Nikos Mavrogiannopoulos
nmav at gnutls.org
Thu Nov 13 19:29:30 CET 2008
Martin von Gagern wrote:
> Hi again.
>
> While looking at _gnutls_x509_verify_certificate I realized that I
> personally would have implemented this whole verification process a bit
> differently. I'm not a regular reader of the gnutls-devel list, but I
> have the feeling that some recent posts might go in the same direction.
>
> I'd have the function called with a single certificate to verify, a list
> of untrusted certificates to be used for the chain, and a list of
> trusted certificates to be used as the root. The verification process
> would look for the issuer of the current certificate first in the list
> of trusted certificates. If it finds one, verify and return result. If
> not, look for the issuer in the list of untrusted certificates. If it
> finds one, verify that next (recursively), if not we don't have enough
> material for a chain.
>
> This process would have two benefits. The order in which the
> intermediate certificates are submitted wouldn't matter any more. And
> you could also add some intermediate certificate to the list of trusted
> certificates, in order to trust a subtree of the hierarchy, and the
> server could still continue to submit its whole chain. E.g. a server A
> could submit the chain [A, B, C, D, E], with E as a self-signed root.
> When you only want to trust certificates from C, you would add that to
> your list of trusted CAs, never mind that it's not self signed, and
> GnuTLS would accept A after verifying two signatures, A-B and B-C.
>
[...]
>
> So much for my suggestion. I would assume that this should be fairly
> easy to implement. I don't know whether I will find the time for this in
> the forseeable future, though, especially as I still haven't read large
> parts of the GnuTLS codebase. So I offer this for discussion, and leave
> it for you to comment, maybe even implement, or wait until I find the
> time and motivation.
Hello Martin,
Indeed we are discussing possibility of updating the included
verification procedure. My opinion would be to leave the current
implementation of gnutls_certificate_verify_peers2() as it is now, and
enhance the X.509 library with more flexibility in verification.
My thoughs in API would be:
add in
enum certificate_verify_flags { GNUTLS_VERIFY_LIST_UNORDERED,
GNUTLS_VERIFY_RFC5280 }
/*
When GNUTLS_VERIFY_LIST_UNORDERED is specified then the chain is
constructed on the fly by using the algorithm you propose.
The flag GNUTLS_VERIFY_RFC5280 should use the verification discussed in
rfc5280. However this algorithm is complex and there are many things
that can go wrong when implementing it.
*/
/*
One could enhance the verification function as:
*/
struct {
gnutls_x509_crt_t crt;
unsigned int verification_status;
verify_chain * issuer;
} verify_chain;
/*
This structure will be used to notify the caller about the constructed
chain and about the verification status of this certificate verified by
the issuer.
*/
int
gnutls_x509_crt_list_verify2 (const gnutls_x509_crt_t * cert_list,
int cert_list_length,
const gnutls_x509_crt_t * CA_list,
int CA_list_length,
const gnutls_x509_crl_t * CRL_list,
int CRL_list_length,
unsigned int flags,
time_t now, /* current time */
verify_chain *chain,
unsigned int max_chain_size, /* require the caller to allocate
chain */
unsigned int *verify)
)
Said, that. I'm unable to work on something like that in the near future.
regards,
Nikos
More information about the Gnutls-devel
mailing list