CURLOPT_SSLCERT(3)
π CURLOPT_SSLCERT(3) β SSL client certificate π
Okay so bestie, this page is from the Library Functions Manual and it's here to explain CURLOPT_SSLCERT, aka your SSL client certificate moment π
β¨. No cap, it's giving "prove who you are" energy.
β¨ NAME β¨
CURLOPT_SSLCERT β SSL client certificate. That's it, that's the main character π
β¨ SYNOPSIS β¨
#include <curl/curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERT, char *cert);
β¨ DESCRIPTION β¨
Pass a pointer to a null-terminated string as the parameter, bestie. The string should be the filename of your client certificate. The default format is PEM, but you can change it with CURLOPT_SSLCERTTYPE(3) β iykyk π
.
For the Schannel girlies: client certificates can be specified by a path expression to a certificate store. (You can import PFX to a store first, lowkey important.) You can use <store location>\<store name>\<thumbprint> to refer to a certificate in the system certificates store, for example:
"CurrentUser\MY\934a7ac6f8a5d5"
The thumbprint is usually a SHA-1 hex string which you can see in certificate details. Following store locations are supported:
CurrentUserLocalMachineCurrentServiceServicesCurrentUserGroupPolicyLocalMachineGroupPolicyLocalMachineEnterprise
Schannel also supports a P12 certificate file, with the string P12 specified with CURLOPT_SSLCERTTYPE(3) π«Ά.
When using a client certificate, you most likely also need to provide a private key with CURLOPT_SSLKEY(3). The application does not have to keep the string around after setting this option, so no need to clutch it forever π.
Using this option multiple times makes the last set string override the previous ones. Set it to NULL to disable its use again. Periodt.
β¨ DEFAULT β¨
NULL
β¨ PROTOCOLS β¨
This functionality affects all TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
All TLS backends support this option. Slay π.
β¨ EXAMPLE β¨
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);
}
}
β¨ AVAILABILITY β¨
Added in curl 7.1 π¦.
β¨ 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). Not me checking the error code every single time π.
β¨ SEE ALSO β¨
Cute sign-off time: this was libcurl, dated 2026-10-12, page CURLOPT_SSLCERT(3). Stay certified, bestie π«Άπβ¨
π¦ where this page comes from
- fedora 44: libcurl-devel 8.18.0-14.fc44 Β· curl
- fedora 44: libcurl-devel 8.18.0-14.fc44 Β· curl
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms