curl\_global\_sslset(3) Library Functions Manual curl\_global\_sslset(3)

# [NAME](#NAME)

curl\_global\_sslset - select SSL backend to use

# [SYNOPSIS](#SYNOPSIS)

```
#include <curl/curl.h>
CURLsslset curl_global_sslset(curl_sslbackend id,


                              const char *name,


                              const curl_ssl_backend ***avail);
```

# [DESCRIPTION](#DESCRIPTION)

This function configures at runtime which SSL backend to use with libcurl. This function can only be used to select an SSL backend once, and it must be called **before** [*curl\_global\_init(3)*](/man/os/curl/curl_global_init.3).

The backend can be identified by the *id* (e.g. **CURLSSLBACKEND\_OPENSSL**). The backend can also be specified via the *name* parameter for a case insensitive match (passing **CURLSSLBACKEND\_NONE** as *id*). If both *id* and *name* are specified, the *name* is ignored.

If neither *id* nor *name* are specified, the function fails with **CURLSSLSET\_UNKNOWN\_BACKEND** and set the *avail* pointer to the null-terminated list of available backends. The available backends are those that this particular build of libcurl supports.

Since libcurl 7.60.0, the *avail* pointer is always set to the list of alternatives if non-NULL.

Upon success, the function returns **CURLSSLSET\_OK**.

If the specified SSL backend is not available, the function returns **CURLSSLSET\_UNKNOWN\_BACKEND** and sets the *avail* pointer to a null-terminated list of available SSL backends. In this case, you may call the function again to try to select a different backend.

The SSL backend can be set only once. If it has already been set, a subsequent attempt to change it results in a **CURLSSLSET\_TOO\_LATE** getting returned.

This function is thread-safe since libcurl 7.84.0 if [*curl\_version\_info(3)*](/man/os/curl/curl_version_info.3) has the CURL\_VERSION\_THREADSAFE feature bit set (most platforms).

If this is not thread-safe, you must not call this function when any other thread in the program (i.e. a thread sharing the same memory) is running. This does not only mean no other thread that is using libcurl.

# [Names](#Names)

SSL backend names (case-insensitive): GnuTLS, mbedTLS, OpenSSL, Rustls, Schannel, wolfSSL

The name "OpenSSL" is used for all versions of OpenSSL and its associated forks/flavors in this function. AmiSSL, AWS-LC, BoringSSL, LibreSSL, OpenSSL and quictls are all supported by libcurl, but in the eyes of [*curl\_global\_sslset(3)*](/man/os/curl/curl_global_sslset.3) they are all called "OpenSSL". They all mostly provide the same API. [*curl\_version\_info(3)*](/man/os/curl/curl_version_info.3) can return more specific info about the exact OpenSSL flavor and version number in use.

# [struct](#struct)

```
typedef struct {


  curl_sslbackend id;


  const char *name;
} curl_ssl_backend;
typedef enum {


  CURLSSLBACKEND_NONE = 0,


  CURLSSLBACKEND_OPENSSL = 1, /* or one of its forks */


  CURLSSLBACKEND_GNUTLS = 2,


  CURLSSLBACKEND_NSS = 3,


  CURLSSLBACKEND_GSKIT = 5, /* deprecated */


  CURLSSLBACKEND_POLARSSL = 6, /* deprecated */


  CURLSSLBACKEND_WOLFSSL = 7,


  CURLSSLBACKEND_SCHANNEL = 8,


  CURLSSLBACKEND_SECURETRANSPORT = 9, /* deprecated */


  CURLSSLBACKEND_AXTLS = 10, /* deprecated */


  CURLSSLBACKEND_MBEDTLS = 11,


  CURLSSLBACKEND_MESALINK = 12, /* deprecated */


  CURLSSLBACKEND_BEARSSL = 13, /* deprecated */


  CURLSSLBACKEND_RUSTLS = 14
} curl_sslbackend;
```

# [PROTOCOLS](#PROTOCOLS)

This functionality affects all supported protocols

# [EXAMPLE](#EXAMPLE)

```
int main(void)
{


  const curl_ssl_backend **list;


  int i;


  /* choose a specific backend */


  curl_global_sslset(CURLSSLBACKEND_WOLFSSL, NULL, NULL);


  /* list the available ones */


  curl_global_sslset(CURLSSLBACKEND_NONE, NULL, &list);


  for(i = 0; list[i]; i++)


    printf("SSL backend #%d: '%s' (ID: %u)\n",


           i, list[i]->name, list[i]->id);
}
```

# [AVAILABILITY](#AVAILABILITY)

Added in curl 7.56.0

# [RETURN VALUE](#RETURN_VALUE)

If this function returns *CURLSSLSET\_OK*, the backend was successfully selected.

If the chosen backend is unknown (or support for the chosen backend has not been compiled into libcurl), the function returns *CURLSSLSET\_UNKNOWN\_BACKEND*.

If the backend had been configured previously, or if [*curl\_global\_init(3)*](/man/os/curl/curl_global_init.3) has already been called, the function returns *CURLSSLSET\_TOO\_LATE*.

If this libcurl was built completely without SSL support, with no backends at all, this function returns *CURLSSLSET\_NO\_BACKENDS*.

# [SEE ALSO](#SEE_ALSO)

[**curl\_global\_init**(3)](/man/os/curl/curl_global_init.3), [**libcurl**(3)](/man/os/curl/libcurl.3)

2026-10-14 libcurl

---

Document: curl_global_sslset(3) from curl 8.23.0-r0 (Chainguard OS)
Source: https://github.com/curl/curl.git
