HI,

I need to prepare for some codes to verify globus proxy certificate in
my teaching,
but I meet some problems when I try to write the c codes with OpenSSL.

The codes I implemented to verify globus proxy certificate is listed
as follows,
but it does not work well.

--------------------------------------- codes
-----------------------------------------------
struct _my_credentials
{
      X509            *certificate;              //  proxy certificate
      EVP_PKEY        *private_key;    //
      STACK           *certificate_chain;  //  certificate chain
stored in issuer certificate

};

typedef struct _my_credentials SSL_CREDENTIALS;
----------------------------------------------------------------------------------------------------------

The above struct is used to hold Globus proxy certificate. Simply, I
inherited it
from similar one of myproxy, and loaded information of proxy by
myproxy's interfaces.
But I  want to rewrite a simple function to verify  proxy for easily
understood by
my students.

The codes for verifying proxy are as follows:


-----------------------------------------  codes
---------------------------------------------

int my_verifycert(SSL_CREDENTIALS *creds,char* CAfile)
{
      int      ret,i,j;
      X509 *x1 = NULL ;
      X509_STORE *store=NULL;
      X509      *cert = NULL ;
      X509_STORE_CTX ctx;
      X509_LOOKUP *lookup=NULL;
      STACK_OF(X509)* tchain = NULL;
      char *CRLfile = NULL,*certdir = "./";

      ret =  SSL_ERROR;
      OpenSSL_add_all_algorithms();

      //  hold the proxy certificate
      x1 = creds->certificate;

      // process certificate chain
      // add certs chains to stack
      if((tchain = sk_X509_new_null()) == NULL)
      {
              printf("%s:sk_X509_new_null() fail\n",__FUNCTION__);
              goto err;
      }
      if (creds->certificate_chain != NULL)
      {
              for (i = 0; i < sk_X509_num(creds->certificate_chain); i++)
              {
                      cert = sk_X509_value(creds->certificate_chain, i);
                      j = sk_X509_push(tchain, cert);
                      if (!j)
                      {
                                      printf("%s:sk_X509_push()
fail\n",__FUNCTION__);
                                      goto err;
                       }
              }
      }

      store=X509_STORE_new();

      lookup=X509_STORE_add_lookup(store,X509_LOOKUP_file());
      if(lookup == NULL) return SSL_ERROR;
      ret=X509_LOOKUP_load_file(lookup,CAfile,X509_FILETYPE_PEM);
      if(!ret) return SSL_ERROR;

      lookup=X509_STORE_add_lookup(store,X509_LOOKUP_file());
      if(lookup == NULL) return SSL_ERROR;

      lookup=X509_STORE_add_lookup(store,X509_LOOKUP_hash_dir());
      if(lookup == NULL) return SSL_ERROR;

      ret = X509_LOOKUP_add_dir(lookup,certdir,X509_FILETYPE_DEFAULT);
      if(!ret) return SSL_ERROR;

      //X509_STORE_CTX_set_flags(&ctx,X509_V_FLAG_ALLOW_PROXY_CERTS);

      if(!X509_STORE_CTX_init(&ctx,store ,x1,NULL))   //  verify x1,
proxy certificate
         return SSL_ERROR;

      if(tchain) X509_STORE_CTX_trusted_stack(&ctx, tchain);
      ret=X509_verify_cert(&ctx);
      if(ret != !)
      {
                    printf("return code %d - %s\n",ctx.error,

(char*)X509_verify_cert_error_string(ctx.error));
                   goto err;
      }

      ret = SSL_SUCCESS;
err:
      X509_STORE_CTX_cleanup(&ctx);
      if(store)X509_STORE_free(store);
      return ret;

}

--------------------------------------------------------------------------------------------------------

But when I test the codes, it threw out a error message:

return code 2 -  unable to get issuer certificate

In Globus, the issuer certificate has been stored in proxy's
certificate chain, I check the chain and found the issuer's certificate
had been put in tchain.

I don't know why it threw out this message and return a fail.
Could anybody give me some advices.



Thanks in advance.


Best Regards,
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to