The _gnutls_x509_verify_certificate fix
Simon Josefsson
simon at josefsson.org
Tue Nov 11 16:05:42 CET 2008
Tomas Mraz <tmraz at redhat.com> writes:
> On Mon, 2008-11-10 at 21:04 +0100, Nikos Mavrogiannopoulos wrote:
>> On Mon, Nov 10, 2008 at 2:47 PM, Tomas Mraz <tmraz at redhat.com> wrote:
>> > Hello,
>> > given the recent fix in the _gnutls_x509_verify_certificate I have been
>> > looking at the function. I see there are currently some limitations in
>> > it. For example it now doesn't allow verification of explicitely trusted
>> > self-signed site certificate. Is there some other method how this could
>> > be achieved?
>> You can achieve it by associating an address of a website with the
>> keyid of the given
>> certificate. This is more generic of trusting a self-signed
>> certificate. You can trust any
>> certificate first presented when accessing a website that way (ssh security).
>
> But the patch should be modified anyway because in case the server
> presents just a self-signed site certificate there will be a dereference
> of the certificate_list[-1].
>
> It is also questionable whether the function should not also check for
> clist_size of 0 before calling _gnutls_verify_certificate2().
Indeed. This may explain:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=505279
/Simon
> --
> Tomas Mraz
> No matter how far down the wrong road you've gone, turn back.
> Turkish proverb
> diff -up gnutls-1.4.1/lib/x509/verify.c.chain-verify gnutls-1.4.1/lib/x509/verify.c
> --- gnutls-1.4.1/lib/x509/verify.c.chain-verify 2008-11-11 10:55:19.000000000 +0100
> +++ gnutls-1.4.1/lib/x509/verify.c 2008-11-11 10:58:54.000000000 +0100
> @@ -379,6 +379,17 @@ _gnutls_x509_verify_certificate (const g
> int i = 0, ret;
> unsigned int status = 0, output;
>
> + /* Check if the last certificate in the path is self signed.
> + * In that case ignore it (a certificate is trusted only if it
> + * leads to a trusted party by us, not the server's).
> + */
> + if (clist_size > 1 &&
> + gnutls_x509_crt_check_issuer (certificate_list[clist_size - 1],
> + certificate_list[clist_size - 1]) > 0)
> + {
> + clist_size--;
> + }
> +
> /* Verify the last certificate in the certificate path
> * against the trusted CA certificate list.
> *
> @@ -417,17 +428,6 @@ _gnutls_x509_verify_certificate (const g
> }
> #endif
>
> - /* Check if the last certificate in the path is self signed.
> - * In that case ignore it (a certificate is trusted only if it
> - * leads to a trusted party by us, not the server's).
> - */
> - if (gnutls_x509_crt_check_issuer (certificate_list[clist_size - 1],
> - certificate_list[clist_size - 1]) > 0
> - && clist_size > 0)
> - {
> - clist_size--;
> - }
> -
> /* Verify the certificate path (chain)
> */
> for (i = clist_size - 1; i > 0; i--)
> _______________________________________________
> Gnutls-devel mailing list
> Gnutls-devel at gnu.org
> http://lists.gnu.org/mailman/listinfo/gnutls-devel
More information about the Gnutls-devel
mailing list