CURLOPT_SSLKEY(3)

hiii bestie πŸ’– welcome to the Library Functions Manual page for CURLOPT_SSLKEY(3) ✨ we’re about to make private-key filenames make sense, no cap.

🌸 NAME 🌸

CURLOPT_SSLKEY β€” private key file for TLS and SSL client cert πŸŽ€

✨ SYNOPSIS ✨

#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEY, char *keyfile);

that’s the signature, bestie β€” copy it exactly and you’re golden πŸ‘‘

πŸ’– DESCRIPTION πŸ’–

okay so here’s the tea β˜•: you pass a pointer to a null-terminated string as parameter. That string should be the filename of your private key. The default format is "PEM" and can be changed with CURLOPT_SSLKEYTYPE(3) πŸ’…

heads up: Using this option multiple times makes the last set string override the previous ones. Set it to NULL to disable its use again. periodt.

The application does not have to keep the string around after setting this option. So you don’t have to babysit that string after the setopt call β€” that’s literally the app’s whole vibe 🫢

(Windows) This option is ignored by the Schannel SSL backend because it expects the private key to be already present in the key-chain or PKCS#12 file containing the certificate. πŸ™ˆ

πŸŽ€ DEFAULT πŸŽ€

NULL β€” literally the default, bestie πŸ’€

πŸ¦‹ PROTOCOLS πŸ¦‹

This functionality affects all TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc. 🌈

This option works only with the following TLS backends: OpenSSL, Rustls, Schannel, mbedTLS and wolfSSL ✨

πŸ”₯ EXAMPLE πŸ”₯

okay bestie, here’s a whole little main-character example β€” keep the code exactly like this:

int main(void)
{
  CURL *curl = curl_easy_init();
  if(curl) {
    CURLcode result;
    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
    curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
    curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
    curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
    result = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
  }
}

and that’s the example, served fresh πŸ“

⭐ AVAILABILITY ⭐

Added in curl 7.9.3 β€” vintage but still iconic πŸ‘‘

πŸ’… RETURN VALUE πŸ’…

curl_easy_setopt(3) returns a CURLcode indicating success or error ✨

CURLE_OK (0) means everything was OK, non-zero means an error occurred, see libcurl-errors(3) πŸ’œ

🌈 SEE ALSO 🌈


xoxo, your libcurl bestie πŸ’– β€” source/version: libcurl, date: 2026-10-12 🌈

πŸ“¦ where this page comes from