Couple of questions regarding CommonName and peer verification

lfinsto at gwdg.de lfinsto at gwdg.de
Wed Aug 25 12:33:55 CEST 2010


On Mon, August 23, 2010 8:28 pm, org.gnu.help-gnutls at coreland.ath.cx wrote:
> 'Lo.
> I'm working on a small server program (the actual details of which
aren't important).
> I want to use certificates and TLS to provide strong authentication but
two questions still remain:
> 1. Users have accounts on the server. A user may have many
>    certificates registered to his account (and may log in using
>    any of them). I want the user's username to appear in each
>    certificate and the proper place for this appears to be in
>    the CommonName field. The problem: Unless I'm mistaken, this
>    field seems to be assumed to contain a hostname which is then checked
and results in a warning if it doesn't match the
>    expected value (which of course, it never will). Is there
>    a better place to put an application-specific username in
>    certificates?

I have the same problem.  My solution is to not call
`gnutls_x509_crt_check_hostname' when verifying the client certificate. I
have a certificate from a "real" CA, i.e., one issued by a research
institution, and the CommonName field contains my name and nothing else. 
It is not intended that it should be bound to any particular machine,
server, domain, or similar entity.  I think it's reasonable for a person
to be able to use a single certificate from various computers.  However,
I'm still finding my way with respect to X.509 certificates, so perhaps
there's a better solution.  At any rate, this certificate, which I must
use on the client-side, would seem to be incompatible with the use
`gnutls_x509_crt_check_hostname' by the server.
> 2. I want to only allow connections from peers the server
>    has certificates for - a whitelist. What's the simplest
>    way to implement this? At the moment, I can only seem to
>    get GnuTLS to verify peers with the CA (which it needs to
>    do anyway, but I want to add this additional restriction).

I think the best place to do this would be following the call to `accept'
on the server side.  The following (C++) code fragment shows how to get
the IP address (and port) of the client that has just initiated a
connection:
  int listen_sd, sd;
  struct sockaddr_in sa_cli;
  int client_len;
  char topbuf[512];
  stringstream temp_strm;


  [...]

  sd = accept (listen_sd, (SA *) & sa_cli, (socklen_t*) &client_len);
temp_strm.str("");

  temp_strm << thread_ctr_str << "In `listen_auth':  Connection from "
            << inet_ntop (AF_INET,
                          &sa_cli.sin_addr,
                          topbuf, sizeof (topbuf))
                << ", port " << ntohs (sa_cli.sin_port)
                << endl;

I think it should be easy to check it against a list of IP-addresses and
break off the connection if it's not in the list.

> As for the second question, I suppose I could create a server-specific
CA, issue certificates to all clients and then only check connecting
client certs against that CA (effectively creating a whitelist).

I think this would only be useful for testing purposes and wouldn't work
for "real" CA certificates issued by "trusted" organizations.


Laurence Finston


-------------------------------------------------------------
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-help mailing list