119 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*****************************************************************************
 | |
|  *                                  _   _ ____  _     
 | |
|  *  Project                     ___| | | |  _ \| |    
 | |
|  *                             / __| | | | |_) | |    
 | |
|  *                            | (__| |_| |  _ <| |___ 
 | |
|  *                             \___|\___/|_| \_\_____|
 | |
|  *
 | |
|  * $Id$
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| 
 | |
| #include <curl/curl.h>
 | |
| #include <curl/types.h>
 | |
| #include <curl/easy.h>
 | |
| 
 | |
| 
 | |
| /* some requirements for this to work:
 | |
|    1.   set pCertFile to the file with the client certificate
 | |
|    2.   if the key is passphrase protected, set pPassphrase to the
 | |
|         passphrase you use
 | |
|    3.   if you are using a crypto engine:
 | |
|    3.1. set a #define USE_ENGINE
 | |
|    3.2. set pEngine to the name of the crypto engine you use
 | |
|    3.3. set pKeyName to the key identifier you want to use
 | |
|    4.   if you don't use a crypto engine:
 | |
|    4.1. set pKeyName to the file name of your client key
 | |
|    4.2. if the format of the key file is DER, set pKeyType to "DER"
 | |
| 
 | |
|    !! verify of the server certificate is not implemented here !!
 | |
| 
 | |
|    **** This example only works with libcurl 7.9.3 and later! ****
 | |
| 
 | |
| */
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   CURL *curl;
 | |
|   CURLcode res;
 | |
|   FILE *headerfile;
 | |
| 
 | |
|   const char *pCertFile = "testcert.pem";
 | |
|   const char *pCACertFile="cacert.pem";
 | |
| 
 | |
|   const char *pKeyName;
 | |
|   const char *pKeyType;
 | |
| 
 | |
|   const char *pEngine;
 | |
| 
 | |
| #if USE_ENGINE
 | |
|   pKeyName  = "rsa_test";
 | |
|   pKeyType  = "ENG";
 | |
|   pEngine   = "chil";            /* for nChiper HSM... */
 | |
| #else
 | |
|   pKeyName  = "testkey.pem";
 | |
|   pKeyType  = "PEM";
 | |
|   pEngine   = NULL;
 | |
| #endif
 | |
| 
 | |
|   const char *pPassphrase = NULL;
 | |
| 
 | |
|   headerfile = fopen("dumpit", "w");
 | |
| 
 | |
|   curl_global_init(CURL_GLOBAL_DEFAULT);
 | |
| 
 | |
|   curl = curl_easy_init();
 | |
|   if(curl) {
 | |
|     /* what call to write: */
 | |
|     curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://your.favourite.ssl.site");
 | |
|     curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile);
 | |
| 
 | |
|     while(1)                    /* do some ugly short cut... */
 | |
|     {
 | |
|        if (pEngine)             /* use crypto engine */
 | |
|        {
 | |
|           if (curl_easy_setopt(curl, CURLOPT_SSLENGINE,pEngine) != CURLE_OK)
 | |
|           {                     /* load the crypto engine */
 | |
|              fprintf(stderr,"can't set crypto engine\n");
 | |
|              break;
 | |
|           }
 | |
|           if (curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT,1) != CURLE_OK)
 | |
|           {                     /* set the crypto engine as default */
 | |
|                                 /* only needed for the first time you load
 | |
|                                    a engine in a curl object... */
 | |
|              fprintf(stderr,"can't set crypto engine as default\n");
 | |
|              break;
 | |
|           }
 | |
|        }
 | |
|                                 /* cert is stored PEM coded in file... */
 | |
|                                 /* since PEM is default, we needn't set it for PEM */
 | |
|        curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
 | |
|                                 /* set the cert for client authentication */
 | |
|        curl_easy_setopt(curl,CURLOPT_SSLCERT,pCertFile);
 | |
|                                 /* sorry, for engine we must set the passphrase
 | |
|                                    (if the key has one...) */
 | |
|        if (pPassphrase)
 | |
|           curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,pPassphrase);
 | |
|                                 /* if we use a key stored in a crypto engine,
 | |
|                                    we must set the key type to "ENG" */
 | |
|        curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,pKeyType);
 | |
|                                 /* set the private key (file or ID in engine) */
 | |
|        curl_easy_setopt(curl,CURLOPT_SSLKEY,pKeyName);
 | |
|                                 /* set the file with the certs vaildating the server */
 | |
|        curl_easy_setopt(curl,CURLOPT_CAINFO,pCACertFile);
 | |
|                                 /* disconnect if we can't validate server's cert */
 | |
|        curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,1);
 | |
|        
 | |
|        res = curl_easy_perform(curl);
 | |
|        break;                   /* we are done... */
 | |
|     }
 | |
|     /* always cleanup */
 | |
|     curl_easy_cleanup(curl);
 | |
|   }
 | |
| 
 | |
|   curl_global_cleanup();
 | |
| 
 | |
|   return 0;
 | |
| }
 | 
