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