Imported Upstream version 7.48.0
[platform/upstream/curl.git] / docs / libcurl / opts / CURLOPT_SSL_CTX_FUNCTION.html
index add6819..6fc4524 100644 (file)
@@ -65,12 +65,86 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_FUNCTION,
 <p class="level0">Pass a pointer to your callback function, which should match the prototype shown above. 
 <p class="level0">This callback function gets called by libcurl just before the initialization of an SSL connection after having processed all other SSL related options to give a last chance to an application to modify the behaviour of the SSL initialization. The <span Class="emphasis">ssl_ctx</span> parameter is actually a pointer to the SSL library's <span Class="emphasis">SSL_CTX</span>. If an error is returned from the callback no attempt to establish a connection is made and the perform operation will return the callback's error code. Set the <span Class="emphasis">userptr</span> argument with the <a Class="emphasis" href="./CURLOPT_SSL_CTX_DATA.html">CURLOPT_SSL_CTX_DATA</a> option. 
 <p class="level0">This function will get called on all new connections made to a server, during the SSL negotiation. The SSL_CTX pointer will be a new one every time. 
-<p class="level0">To use this properly, a non-trivial amount of knowledge of your SSL library is necessary. For example, you can use this function to call library-specific callbacks to add additional validation code for certificates, and even to change the actual URI of a HTTPS request (example used in the lib509 test case).  See also the example section for a replacement of the key, certificate and trust file settings. <a name="DEFAULT"></a><h2 class="nroffsh">DEFAULT</h2>
+<p class="level0">To use this properly, a non-trivial amount of knowledge of your SSL library is necessary. For example, you can use this function to call library-specific callbacks to add additional validation code for certificates, and even to change the actual URI of a HTTPS request. <a name="DEFAULT"></a><h2 class="nroffsh">DEFAULT</h2>
 <p class="level0">NULL <a name="PROTOCOLS"></a><h2 class="nroffsh">PROTOCOLS</h2>
-<p class="level0">All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. <a name="EXAMPLE"></a><h2 class="nroffsh">EXAMPLE</h2>
-<p class="level0">TODO <a name="AVAILABILITY"></a><h2 class="nroffsh">AVAILABILITY</h2>
+<p class="level0">All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc. <a name="EXAMPLE"></a><h2 class="nroffsh">EXAMPLE</h2>
+<p class="level0"><pre class="level0">
+/* OpenSSL specific */
+&nbsp;
+&#35;include &lt;openssl/ssl.h&gt;
+&#35;include &lt;curl/curl.h&gt;
+&#35;include &lt;stdio.h&gt;
+&nbsp;
+static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
+{
+&nbsp; X509_STORE *store;
+&nbsp; X509 *cert=NULL;
+&nbsp; BIO *bio;
+&nbsp; char *mypem = /* example CA cert PEM - shortened */
+&nbsp;   "-----BEGIN CERTIFICATE-----n"
+&nbsp;   "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290n"
+&nbsp;   "IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNBn"
+&nbsp;   "IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRAn"
+&nbsp;   "Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAOn"
+&nbsp;   "GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzkn"
+&nbsp;   "zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmWn"
+&nbsp;   "omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVDn"\
+&nbsp;   "-----END CERTIFICATE-----n";
+&nbsp; /* get a BIO */
+&nbsp; bio=BIO_new_mem_buf(mypem, -1);
+&nbsp; /* use it to read the PEM formatted certificate from memory into an X509
+&nbsp;  * structure that SSL can use
+&nbsp;  */
+&nbsp; PEM_read_bio_X509(bio, &cert, 0, NULL);
+&nbsp; if(cert == NULL)
+&nbsp;   printf("PEM_read_bio_X509 failed...n");
+&nbsp;
+&nbsp; /* get a pointer to the X509 certificate store (which may be empty!) */
+&nbsp; store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
+&nbsp;
+&nbsp; /* add our certificate to this store */
+&nbsp; if(X509_STORE_add_cert(store, cert)==0)
+&nbsp;   printf("error adding certificaten");
+&nbsp;
+&nbsp; /* decrease reference counts */
+&nbsp; X509_free(cert);
+&nbsp; BIO_free(bio);
+&nbsp;
+&nbsp; /* all set to go */
+&nbsp; return CURLE_OK;
+}
+&nbsp;
+int main(void)
+{
+&nbsp; CURL * ch;
+&nbsp; CURLcode rv;
+&nbsp;
+&nbsp; rv=curl_global_init(CURL_GLOBAL_ALL);
+&nbsp; ch=curl_easy_init();
+&nbsp; rv=curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+&nbsp; rv=curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
+&nbsp; rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+&nbsp;
+&nbsp; /* Retrieve page using cacerts' certificate -&gt; will succeed
+&nbsp;  * load the certificate by installing a function doing the nescessary
+&nbsp;  * "modifications" to the SSL CONTEXT just before link init
+&nbsp;  */
+&nbsp; rv=curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+&nbsp; rv=curl_easy_perform(ch);
+&nbsp; if(rv==CURLE_OK)
+&nbsp;   printf("*** transfer succeeded ***n");
+&nbsp; else
+&nbsp;   printf("*** transfer failed ***n");
+&nbsp;
+&nbsp; curl_easy_cleanup(ch);
+&nbsp; curl_global_cleanup();
+&nbsp; return rv;
+}
+</pre>
+
+<p class="level0"><a name="AVAILABILITY"></a><h2 class="nroffsh">AVAILABILITY</h2>
 <p class="level0">Added in 7.11.0 for OpenSSL. Added in 7.42.0 for wolfSSL/CyaSSL. Other SSL backends not supported. <a name="RETURN"></a><h2 class="nroffsh">RETURN VALUE</h2>
 <p class="level0">Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. <a name="SEE"></a><h2 class="nroffsh">SEE ALSO</h2>
-<p class="level0"><a Class="manpage" href="./CURLOPT_SSL_CTX_DATA.html">CURLOPT_SSL_CTX_DATA</a>, <a Class="manpage" href="./CURLOPT_SSL_VERIFYPEER.html">CURLOPT_SSL_VERIFYPEER</a>, <span Class="manpage"> </span> <p class="roffit">
+<p class="level0"><a Class="manpage" href="./CURLOPT_SSL_CTX_DATA.html">CURLOPT_SSL_CTX_DATA</a>, <a Class="manpage" href="./CURLOPT_SSL_VERIFYPEER.html">CURLOPT_SSL_VERIFYPEER</a><p class="roffit">
  This HTML page was made with <a href="http://daniel.haxx.se/projects/roffit/">roffit</a>.
 </body></html>