SSL_CTX_LOAD_VERIFY_LOCATIONS(3SSL)

✨ SSL_CTX_LOAD_VERIFY_LOCATIONS ✨ (the 3SSL girlies know)

okay bestie, sit DOWN, because this is the page where OpenSSL learns who it's supposed to trust πŸ«ΆπŸ’– This is your whole little squad of functions:

  • SSL_CTX_load_verify_dir
  • SSL_CTX_load_verify_file
  • SSL_CTX_load_verify_store
  • SSL_CTX_set_default_verify_paths
  • SSL_CTX_set_default_verify_dir
  • SSL_CTX_set_default_verify_file
  • SSL_CTX_set_default_verify_store
  • SSL_CTX_load_verify_locations

…and their whole job is setting default locations for trusted CA certificates. literally the VIP list for your TLS handshake πŸ’…


🌸 SYNOPSIS 🌸

#include <openssl/ssl.h>

int SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath);
int SSL_CTX_load_verify_file(SSL_CTX *ctx, const char *CAfile);
int SSL_CTX_load_verify_store(SSL_CTX *ctx, const char *CAstore);

int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx);

int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx);
int SSL_CTX_set_default_verify_file(SSL_CTX *ctx);
int SSL_CTX_set_default_verify_store(SSL_CTX *ctx);

int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
                                  const char *CApath);

copy that, keep it exact, no cap πŸ’―


πŸ’– DESCRIPTION πŸ’–

SSL_CTX_load_verify_locations(), SSL_CTX_load_verify_dir(), SSL_CTX_load_verify_file() and SSL_CTX_load_verify_store() are the ones that tell ctx where the CA certificates for verification purposes actually live. Whatever certs you can reach through CAfile, CApath and CAstore? Yeah, those are trusted. Trusted trusted. White-listed. And ctx MUST NOT be NULL β€” that's not a suggestion bestie, that's the law 😭

All the deets about certificate verification and chain checking live over in "Certification Path Validation" in openssl-verification-options(1) if you wanna go deeper πŸ‘‘

SSL_CTX_set_default_verify_paths() says: yeah let's just use the default locations where CA certs get loaded from. There's one default directory, one default file and one default store. The default CA certificates directory is called certs in the default OpenSSL directory, and that same thing is also the default store ✨. Alternatively, the SSL_CERT_DIR environment variable can be defined to override this location. The default CA certificates file is called cert.pem in the default OpenSSL directory. Alternatively, the SSL_CERT_FILE environment variable can be defined to override this location. Oh and β€” ctx MUST NOT be NULL 🫠

SSL_CTX_set_default_verify_dir() is giving SSL_CTX_set_default_verify_paths() energy except, like, only the default directory gets used.

SSL_CTX_set_default_verify_file() is the same vibe again except only the default file gets used.

SSL_CTX_set_default_verify_store() β€” you guessed it β€” same as SSL_CTX_set_default_verify_paths() except just the default store is used. consistent queen πŸ’…


πŸŽ€ NOTES πŸŽ€

If CAfile is not NULL, it points to a file of CA certificates in PEM format. That file can hold several CA certificates identified by sequences like this:

-----BEGIN CERTIFICATE-----
... (CA certificate in base64 encoding) ...
-----END CERTIFICATE-----

Before, between and after those certificates, text is allowed β€” perfect for descriptions of the certificates, cute little annotations, whatever you want πŸ“

The CAfile is processed on execution of the SSL_CTX_load_verify_locations() function. like, at the moment you call it, fr fr.

If CApath is not NULL, it points to a directory containing CA certificates in PEM format. Each file contains one CA certificate. The files are looked up by the CA subject name hash value, which must hence be available. And if more than one CA certificate with the same name hash value exists, the extension MUST be different (e.g. 9d66eef0.0, 9d66eef0.1 etc). The search is performed in the ordering of the extension number, regardless of any other properties of the certificates. Use the openssl rehash utility to create the necessary links πŸ”—

The certificates in CApath are only looked up when required β€” like when building the certificate chain, or when actually performing the verification of a peer certificate. so lowkey lazy, and honestly? respect πŸ™ˆ

When looking up CA certificates for chain building, the OpenSSL library will search for suitable certificates first in CAfile, then in CApath. Details of the chain building process are described in "Certification Path Building" in openssl-verification-options(1).

If CAstore is not NULL, it's a URI for a store, which may represent a single container or a whole catalogue of containers. Apart from the CAstore not necessarily being a local file or directory, it's generally treated the same way as a CApath. ✨

In server mode, when requesting a client certificate, the server must send the list of CAs of which it will accept client certificates πŸ—’οΈ. This list is not influenced by the contents of CAfile or CApath and must explicitly be set using the SSL_CTX_set_client_CA_list(3) family of functions. so don't be out here thinking your CApath is doing that job, it is NOT 😀

When building its own certificate chain, an OpenSSL client/server will try to fill in missing certificates from CAfile/CApath, if the certificate chain was not explicitly specified (see SSL_CTX_add_extra_chain_cert(3), SSL_CTX_use_certificate(3)).


πŸ’€ WARNINGS πŸ’€

okay this is the part where we get serious for a sec, bestie, because this one bites people:

If several CA certificates matching the name, key identifier, and serial number condition are available, only the first one will be examined. This may lead to unexpected results if the same CA certificate is available with different expiration dates 😭. If a "certificate expired" verification error occurs, no other certificate will be searched.

Make sure to not have expired certificates mixed with valid ones. like, clean your room. the vibes and the certs both 🧹

⭐ RETURN VALUES ⭐

For SSL_CTX_load_verify_locations the following return values can occur:

  • 0 β€” the operation failed because CAfile and CApath are NULL, or the processing at one of the locations specified failed. Check the error stack to find out the reason πŸ”
  • 1 β€” the operation succeeded. slay πŸ’…

SSL_CTX_set_default_verify_paths(), SSL_CTX_set_default_verify_dir() and SSL_CTX_set_default_verify_file() all return 1 on success or 0 on failure. A missing default location is still treated as a success β€” iconic behaviour honestly, very "no thoughts, success only" 🌈


πŸ¦‹ EXAMPLES πŸ¦‹

Generate a CA certificate file with descriptive text from the CA certificates ca1.pem ca2.pem ca3.pem:

#!/bin/sh
rm CAfile.pem
for i in ca1.pem ca2.pem ca3.pem ; do
    openssl x509 -in $i -text >> CAfile.pem
done

Prepare the directory /some/where/certs containing several CA certificates for use as CApath:

cd /some/where/certs
openssl rehash .

go off πŸ‘‘ run those, they work, they're cute, they're the whole technique.


πŸ‘‘ SEE ALSO πŸ‘‘

ssl(7), SSL_CTX_set_client_CA_list(3), SSL_get_client_CA_list(3), SSL_CTX_use_certificate(3), SSL_CTX_add_extra_chain_cert(3), SSL_CTX_set_cert_store(3), SSL_CTX_set_client_CA_list(3)

(yes SSL_CTX_set_client_CA_list(3) is in there twice. that's the original's business, not mine, we keep it exactly as it is, periodt πŸ’–)


Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.


and that's the tea, bestie β˜• this was OpenSSL 4.0.3, dated 2026-09-2 β€” go load those verify locations, stay trusted, and don't let a NULL ctx ruin your whole day 🫢✨

πŸ“¦ where this page comes from