Handshake and verification
lfinsto at gwdg.de
lfinsto at gwdg.de
Wed Dec 9 15:06:57 CET 2009
Hello,
I've been working on my client-server pair with X.509 authentication,
using the code from the examples in the manuals. I've put the code for
handling the connections into a (POSIX) thread function, i.e., one passed
to `pthread_create'. In order to test this, I've made it possible to call
the client with a `--sleep' argument to put it to sleep for a few seconds.
I call it several times and put it into the background, so several
clients can be running and connected to the server at the same time.
I got this error:
optdbsrv: ath.c:186: _gcry_ath_mutex_lock: Assertion `*lock ==
((ath_mutex_t) 0)' failed.
Aborted
I was able to fix it by locking and unlocking a mutex before and after the
call to `gnutls_handshake'.
I have determined that I don't have the file `ath.c' on my system, so I
will have to download the source distribution of `libgcrypt'. It would be
nicer if one didn't have to lock and unlock a mutex. If it can't be
avoided, perhaps it would be good to document this. (I'll glad to do this
myself, if I can).
I think my server-client pair would make a good example and test case, but
I need to discuss some things with my employer regarding copyright,
permission to publish, etc., and I also haven't gotten the papers from the
FSF yet.
I've tried downloading the sources from the git repository using the
method for developers, but it didn't work. Perhaps I need to register a
public key somewhere; I haven't had a chance to try to find out what I
need to do yet.
*********************
This is my workaround for handling proxy certificates (based on example
from manual and modified):
/* Do the actual verification. */
gnutls_x509_crt_verify (crt, &issuer, 1, 0, &output);
if (output & GNUTLS_CERT_INVALID)
{
if (output & GNUTLS_CERT_SIGNER_NOT_FOUND)
{
fprintf (stderr, "Not trusted");
fprintf (stderr, ": no issuer was found");
}
if (output & GNUTLS_CERT_SIGNER_NOT_CA)
{
fprintf (stderr, "Trusted");
fprintf (stderr, ": issuer is not a CA\n");
fprintf (stderr, "This isn't so important, the previous
certificate might be a proxy.");
}
fprintf (stderr, "\n");
}
else
fprintf (stderr, "Trusted\n");
It would be neater if `GNUTLS_CERT_INVALID' wasn't necessarily true just
because `GNUTLS_CERT_SIGNER_NOT_CA' is, but it doesn't really cause any
harm. If anyone implements any special handling for proxy certificates,
please let me know so I can test them.
Thanks,
Laurence
------------------------------------------------------------
Laurence Finston
Gesellschaft fuer wissenschaftliche Datenverarbeitung mbH
Am Fassberg 11
37077 Goettingen
Telefon: +49 551 201-1882
E-Mail: lfinsto at gwdg.de
More information about the Gnutls-devel
mailing list