Annotation of embedaddon/curl/docs/examples/simplessl.c, revision 1.1.1.1

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
                      9:  *
                     10:  * This software is licensed as described in the file COPYING, which
                     11:  * you should have received as part of this distribution. The terms
                     12:  * are also available at https://curl.haxx.se/docs/copyright.html.
                     13:  *
                     14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
                     15:  * copies of the Software, and permit persons to whom the Software is
                     16:  * furnished to do so, under the terms of the COPYING file.
                     17:  *
                     18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
                     19:  * KIND, either express or implied.
                     20:  *
                     21:  ***************************************************************************/
                     22: /* <DESC>
                     23:  * Shows HTTPS usage with client certs and optional ssl engine use.
                     24:  * </DESC>
                     25:  */
                     26: #include <stdio.h>
                     27: 
                     28: #include <curl/curl.h>
                     29: 
                     30: /* some requirements for this to work:
                     31:    1.   set pCertFile to the file with the client certificate
                     32:    2.   if the key is passphrase protected, set pPassphrase to the
                     33:         passphrase you use
                     34:    3.   if you are using a crypto engine:
                     35:    3.1. set a #define USE_ENGINE
                     36:    3.2. set pEngine to the name of the crypto engine you use
                     37:    3.3. set pKeyName to the key identifier you want to use
                     38:    4.   if you don't use a crypto engine:
                     39:    4.1. set pKeyName to the file name of your client key
                     40:    4.2. if the format of the key file is DER, set pKeyType to "DER"
                     41: 
                     42:    !! verify of the server certificate is not implemented here !!
                     43: 
                     44:    **** This example only works with libcurl 7.9.3 and later! ****
                     45: 
                     46: */
                     47: 
                     48: int main(void)
                     49: {
                     50:   CURL *curl;
                     51:   CURLcode res;
                     52:   FILE *headerfile;
                     53:   const char *pPassphrase = NULL;
                     54: 
                     55:   static const char *pCertFile = "testcert.pem";
                     56:   static const char *pCACertFile = "cacert.pem";
                     57:   static const char *pHeaderFile = "dumpit";
                     58: 
                     59:   const char *pKeyName;
                     60:   const char *pKeyType;
                     61: 
                     62:   const char *pEngine;
                     63: 
                     64: #ifdef USE_ENGINE
                     65:   pKeyName  = "rsa_test";
                     66:   pKeyType  = "ENG";
                     67:   pEngine   = "chil";            /* for nChiper HSM... */
                     68: #else
                     69:   pKeyName  = "testkey.pem";
                     70:   pKeyType  = "PEM";
                     71:   pEngine   = NULL;
                     72: #endif
                     73: 
                     74:   headerfile = fopen(pHeaderFile, "wb");
                     75: 
                     76:   curl_global_init(CURL_GLOBAL_DEFAULT);
                     77: 
                     78:   curl = curl_easy_init();
                     79:   if(curl) {
                     80:     /* what call to write: */
                     81:     curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://your.favourite.ssl.site");
                     82:     curl_easy_setopt(curl, CURLOPT_HEADERDATA, headerfile);
                     83: 
                     84:     do { /* dummy loop, just to break out from */
                     85:       if(pEngine) {
                     86:         /* use crypto engine */
                     87:         if(curl_easy_setopt(curl, CURLOPT_SSLENGINE, pEngine) != CURLE_OK) {
                     88:           /* load the crypto engine */
                     89:           fprintf(stderr, "can't set crypto engine\n");
                     90:           break;
                     91:         }
                     92:         if(curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1L) != CURLE_OK) {
                     93:           /* set the crypto engine as default */
                     94:           /* only needed for the first time you load
                     95:              a engine in a curl object... */
                     96:           fprintf(stderr, "can't set crypto engine as default\n");
                     97:           break;
                     98:         }
                     99:       }
                    100:       /* cert is stored PEM coded in file... */
                    101:       /* since PEM is default, we needn't set it for PEM */
                    102:       curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
                    103: 
                    104:       /* set the cert for client authentication */
                    105:       curl_easy_setopt(curl, CURLOPT_SSLCERT, pCertFile);
                    106: 
                    107:       /* sorry, for engine we must set the passphrase
                    108:          (if the key has one...) */
                    109:       if(pPassphrase)
                    110:         curl_easy_setopt(curl, CURLOPT_KEYPASSWD, pPassphrase);
                    111: 
                    112:       /* if we use a key stored in a crypto engine,
                    113:          we must set the key type to "ENG" */
                    114:       curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, pKeyType);
                    115: 
                    116:       /* set the private key (file or ID in engine) */
                    117:       curl_easy_setopt(curl, CURLOPT_SSLKEY, pKeyName);
                    118: 
                    119:       /* set the file with the certs vaildating the server */
                    120:       curl_easy_setopt(curl, CURLOPT_CAINFO, pCACertFile);
                    121: 
                    122:       /* disconnect if we can't validate server's cert */
                    123:       curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
                    124: 
                    125:       /* Perform the request, res will get the return code */
                    126:       res = curl_easy_perform(curl);
                    127:       /* Check for errors */
                    128:       if(res != CURLE_OK)
                    129:         fprintf(stderr, "curl_easy_perform() failed: %s\n",
                    130:                 curl_easy_strerror(res));
                    131: 
                    132:       /* we are done... */
                    133:     } while(0);
                    134:     /* always cleanup */
                    135:     curl_easy_cleanup(curl);
                    136:   }
                    137: 
                    138:   curl_global_cleanup();
                    139: 
                    140:   return 0;
                    141: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>