Hi, from an SSL server side I want to check the client certificate/private key but I 
don't know how to do this. Below I have wrote a small server sample and it's client. I 
don't know if it's correct what I did. 

// SSL Server
int  listen_sd = socket(AF_INET, SOCK_STREAM, 0);
  
sockaddr_in  sa_serv;
memset(&sa_serv, '\0', sizeof(sa_serv));
sa_serv.sin_family      = AF_INET;
sa_serv.sin_addr.s_addr = INADDR_ANY;
sa_serv.sin_port        = htons (8001);
  
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());
 
SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM);
if(!SSL_CTX_check_private_key(ctx))
 exit(1);

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);
CHK_SSL(SSL_accept(ssl));

X509*  client_cert = SSL_get_peer_certificate(ssl);
if(client_cert != NULL) // is always NULL. why?
{
  printf("Client certificate:\n");
  char* str = X509_NAME_oneline(X509_get_subject_name(client_cert), 0, 0);      
  
  printf("\t subject: %s\n", str);
  free(str);
    
  str = X509_NAME_oneline(X509_get_issuer_name(client_cert), 0, 0);
  printf("\t issuer: %s\n", str);
  free(str);
    
  X509_free(client_cert);
}
.....
// reading/writing operations and cleaning up
.....

and the client looks like this:
// SSL Client
SSLeay_add_ssl_algorithms();
SSL_METHOD*  meth = SSLv3_client_method();
SSL_CTX*     ctx = SSL_CTX_new(meth);

SSL_CTX_use_certificate_chain_file(ctx, CERTF);
SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM);
 
int  sd = socket(AF_INET, SOCK_STREAM, 0);     
 
sockaddr_in sa;
memset(&sa, '\0', sizeof(sa));
sa.sin_family      = AF_INET;
sa.sin_addr.s_addr = inet_addr("127.0.0.1"); // Server IP
sa.sin_port        = htons(8001);            // Server Port number

connect(sd, (sockaddr*)&sa, sizeof(sa));

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


What is wrong on the code above?


____________________________________________________________
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