X509_GET_EXTENSION_FLAGS(3ossl)

πŸ“¦
version 15.1 Β· 3 versions
, in freebsd 15.1

πŸ’… X509_GET_EXTENSION_FLAGS πŸ’…

okay bestie, welcome to the 3ossl girlies' guide to pulling certificate extension data out of an X509 πŸŽ€ this is the whole "hey what's actually in this cert" toolkit, and honestly it's giving main character energy for anyone doing validation work. no cap.


✨ NAME ✨

X509_get0_subject_key_id, X509_get0_authority_key_id, X509_get0_authority_issuer, X509_get0_authority_serial, X509_get_pathlen, X509_get_extension_flags, X509_get_key_usage, X509_get_extended_key_usage, X509_set_proxy_flag, X509_set_proxy_pathlen, X509_get_proxy_pathlen β€” literally all of these just retrieve certificate extension data πŸ¦‹


🌸 SYNOPSIS 🌸

#include <openssl/x509v3.h>

long X509_get_pathlen(X509 *x);
uint32_t X509_get_extension_flags(X509 *x);
uint32_t X509_get_key_usage(X509 *x);
uint32_t X509_get_extended_key_usage(X509 *x);
const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x);
const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x);
const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x);
const ASN1_INTEGER *X509_get0_authority_serial(X509 *x);
void X509_set_proxy_flag(X509 *x);
void X509_set_proxy_pathlen(int l);
long X509_get_proxy_pathlen(X509 *x);

πŸ’– DESCRIPTION πŸ’–

so these functions are all about yanking info out of the certificate extensions everyone actually uses, periodt.

🧚 X509_get_pathlen()

this one retrieves the path length extension from a certificate. it's the extension that caps how long a cert chain can be when it's issued from that CA. like a "no more than this many girls in the group chat" limit 🫢

πŸ”₯ X509_get_extension_flags()

this bad boy retrieves general info about a certificate, and it returns one or more of these flags ored together (yes, ored, that's the word, slay bitwise ops):

  • EXFLAG_V1 β€” the certificate is an obsolete version 1 certificate. it's giving ancient history πŸ’€
  • EXFLAG_BCONS β€” the certificate contains a basic constraints extension.
  • EXFLAG_CA β€” the certificate contains basic constraints and asserts the CA flag. queen behavior πŸ‘‘
  • EXFLAG_PROXY β€” the certificate is a valid proxy certificate.
  • EXFLAG_SI β€” the certificate is self issued (meaning the subject and issuer names match).
  • EXFLAG_SS β€” the subject and issuer names match and the extension values imply it's self signed.
  • EXFLAG_FRESHEST β€” the freshest CRL extension is present in the certificate.
  • EXFLAG_CRITICAL β€” the certificate contains an unhandled critical extension. 🚩
  • EXFLAG_INVALID β€” some certificate extension values are invalid or inconsistent. the certificate should be rejected. also lowkey this bit may also get raised after an out-of-memory error while processing the X509 object, so it may not even be about the processed ASN1 object itself 😭
  • EXFLAG_NO_FINGERPRINT β€” failed to compute the internal SHA1 hash value of the certificate or CRL. this may be due to malloc failure or because no SHA1 implementation was found πŸ’€
  • EXFLAG_INVALID_POLICY β€” the NID_certificate_policies certificate extension is invalid or inconsistent. the certificate should be rejected. same vibe as above: this bit may also be raised after an out-of-memory error while processing the X509 object, so it may not be related to the processed ASN1 object itself πŸ™ˆ
  • EXFLAG_KUSAGE β€” the certificate contains a key usage extension. the value can be retrieved using X509_get_key_usage().
  • EXFLAG_XKUSAGE β€” the certificate contains an extended key usage extension. the value can be retrieved using X509_get_extended_key_usage().

⭐ X509_get_key_usage()

returns the value of the key usage extension. if key usage is present it'll return zero or more of these flags, all corresponding to individual key usage bits:

KU_DIGITAL_SIGNATURE, KU_NON_REPUDIATION, KU_KEY_ENCIPHERMENT, KU_DATA_ENCIPHERMENT, KU_KEY_AGREEMENT, KU_KEY_CERT_SIGN, KU_CRL_SIGN, KU_ENCIPHER_ONLY or KU_DECIPHER_ONLY.

and if key usage is absent? you get UINT32_MAX. iconic weirdness, but okay πŸŽ€

🌈 X509_get_extended_key_usage()

returns the value of the extended key usage extension. if extended key usage is present it'll return zero or more of:

XKU_SSL_SERVER, XKU_SSL_CLIENT, XKU_SMIME, XKU_CODE_SIGN, XKU_OCSP_SIGN, XKU_TIMESTAMP, XKU_DVCS or XKU_ANYEKU.

these correspond to the OIDs id-kp-serverAuth, id-kp-clientAuth, id-kp-emailProtection, id-kp-codeSigning, id-kp-OCSPSigning, id-kp-timeStamping, id-kp-dvcs and anyExtendedKeyUsage respectively. plus, XKU_SGC gets set if either the Netscape or Microsoft SGC OIDs are present πŸ¦‹

πŸŽ€ X509_get0_subject_key_id()

returns an internal pointer to the subject key identifier of x as an ASN1_OCTET_STRING, or NULL if the extension isn't present or can't be parsed.

πŸ“ X509_get0_authority_key_id()

returns an internal pointer to the authority key identifier of x as an ASN1_OCTET_STRING, or NULL if the extension isn't present or can't be parsed.

🧚 X509_get0_authority_issuer()

returns an internal pointer to the authority certificate issuer of x as a stack of GENERAL_NAME structures, or NULL if the extension isn't present or can't be parsed.

πŸ’œ X509_get0_authority_serial()

returns an internal pointer to the authority certificate serial number of x as an ASN1_INTEGER, or NULL if the extension isn't present or can't be parsed.

πŸ‘‘ X509_set_proxy_flag()

marks the certificate with the EXFLAG_PROXY flag. this exists for the users who need to mark non-RFC3820 proxy certificates as such, because OpenSSL only detects RFC3820 compliant ones. so like, it won't clock your non-compliant fave, you gotta tell it yourself πŸ’…

πŸ’€ X509_set_proxy_pathlen()

sets the proxy certificate path length for the given certificate x. again, for users who need to mark non-RFC3820 proxy certificates as such, because OpenSSL only detects RFC3820 compliant ones.

🌸 X509_get_proxy_pathlen()

returns the proxy certificate path length for the given certificate x, if it's a proxy certificate.


πŸ¦‹ NOTES πŸ¦‹

the value of the flags corresponds to extension values which are cached in the X509 structure. so if the flags returned don't give you enough info, an application should go examine extension values directly β€” for example using X509_get_ext_d2i() πŸ”

if the key usage or extended key usage extension is absent then typically usage is unrestricted. that's literally why X509_get_key_usage() and X509_get_extended_key_usage() return UINT32_MAX when the corresponding extension is absent. applications can additionally check the return value of X509_get_extension_flags() and take appropriate action if an extension is absent πŸ‘€

if X509_get0_subject_key_id() returns NULL then the extension may be absent or malformed β€” those are two very different vibes, bestie. applications can figure out the precise reason using X509_get_ext_d2i().


πŸ’– RETURN VALUES πŸ’–

  • X509_get_pathlen() returns the path length value, or -1 if the extension isn't present.
  • X509_get_extension_flags(), X509_get_key_usage() and X509_get_extended_key_usage() return sets of flags corresponding to the certificate extension values.
  • X509_get0_subject_key_id() returns the subject key identifier as a pointer to an ASN1_OCTET_STRING structure, or NULL if the extension is absent or an error occurred during parsing.
  • X509_get_proxy_pathlen() returns the path length value if the given certificate is a proxy one and has a path length set, and -1 otherwise.

⭐ SEE ALSO ⭐

X509_check_purpose(3) β€” go read it, bestie, it's the companion piece 🫢


🌈 HISTORY 🌈

X509_get_pathlen(), X509_set_proxy_flag(), X509_set_proxy_pathlen() and X509_get_proxy_pathlen() were added in OpenSSL 1.1.0 ✨


Copyright 2015-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>.


okay that's the whole page, no cap πŸ’… this was OpenSSL 3.5.6, dated 2026-04-07, filed under X509_GET_EXTENSION_FLAGS(3ossl) β€” go forth and read your cert extensions, queen πŸ‘‘πŸ’–

πŸ“¦ where this page comes from