I'm trying to check the client certificate from the server side but it's not working 
well. Below is a piece of code from a server and a client application. Is something 
wrong with my code? because the SSL_accept function is failing with 
"SSL3_GET_CLIENT_CERTIFICATE:peer did not return a certificate" error. I have 
generating the certificate using OpenSSL like this:
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem

// SSL server
int main(int argc, char* argv[])
{
  sockaddr_in   sa_serv;
  sa_serv.sin_family      = AF_INET;
  sa_serv.sin_addr.s_addr = INADDR_ANY;
  sa_serv.sin_port        = htons(9000);
  
  int  listen_sd = socket(AF_INET, SOCK_STREAM, 0);
  bind(listen_sd, (sockaddr*)&sa_serv, sizeof(sa_serv));
  listen(listen_sd, 5);
  
  sockaddr_in  sa_cli;
  size_t       client_len = sizeof(sa_cli);
  int  sd = accept(listen_sd, (sockaddr*)&sa_cli, (int*)&client_len);
  closesocket(listen_sd);

  SSLeay_add_ssl_algorithms();
  SSL_CTX*  ctx = SSL_CTX_new(SSLv3_server_method());
  if(!ctx)
    exit(1);

  if(SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0)
    exit(2);

  if(SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0)
    exit(3);

  if(!SSL_CTX_check_private_key(ctx))
    exit(4);

  SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);

  SSL*  ssl = SSL_new(ctx);
  SSL_set_fd(ssl, sd);
  SSL_accept(ssl);

  X509* client_cert = SSL_get_peer_certificate(ssl); // returns always NULL
  if(client_cert == NULL)
    fprintf(stderr, "No client certificate available\n");

  // reading and writing operations
  ...
}


// SSL client
int main(int argc, char* argv[])
{
  sockaddr_in sa;
  sa.sin_family      = AF_INET;
  sa.sin_addr.s_addr = inet_addr("127.0.0.1");
  sa.sin_port        = htons(9000);

  int  sd = socket(AF_INET, SOCK_STREAM, 0);     
  connect(sd, (sockaddr*)&sa, sizeof(sa));

  SSLeay_add_ssl_algorithms();
  SSL_CTX*  ctx = SSL_CTX_new(SSLv3_client_method());
 
  // Initialize PRNG
  RAND_screen();

  if(SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0)
    exit(1);

  SSL*  ssl = SSL_new (ctx);
  SSL_set_fd(ssl, sd);
  SSL_connect(ssl);
    
  // reading and writing operations
  ...
}



____________________________________________________________
Get advanced SPAM filtering on Webmail or POP Mail ... Get Lycos Mail!
http://login.mail.lycos.com/r/referral?aid=27005
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to