X509_GET_EXTENSION_FLAGS(3ossl)
β¨ X509_GET_EXTENSION_FLAGS β¨ β the 3ossl girlies' guide to peeking at cert extensions π
okay bestie, sit down, hydrate, because we're about to go through the OpenSSL 3.5.9 manual page for 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, and X509_get_proxy_pathlen β and no, we are NOT skimming. every single one is getting its moment. π
πΈ 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);
likeβ¦ look at that. a whole roster of little functions whose entire job is "tell me what's inside this certificate." π
π DESCRIPTION π
These functions are the ones you call when you need the tea that lives in the commonly-used certificate extensions. no cap.
π¦ X509_get_pathlen()
retrieves the path length extension from a certificate. this extension is the one that limits how long a cert chain can get when it's issued from that CA. think of it as the "no, you may NOT keep going" extension. π
π X509_get_extension_flags()
pulls general info about a certificate, and it'll hand you back one or more of the following flags, ored together (yes, bitwise-OR'd, it's giving combo meal):
EXFLAG_V1β the certificate is an obsolete version 1 certificate. vintage, but not in the cute way. πEXFLAG_BCONSβ the certificate contains a basic constraints extension.EXFLAG_CAβ the certificate contains basic constraints and asserts the CA flag. she's a certificate authority, periodt.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. freshest! πEXFLAG_CRITICALβ the certificate contains an unhandled critical extension. πEXFLAG_INVALIDβ some certificate extension values are invalid or inconsistent. the certificate should be rejected. this bit may also get raised after an out-of-memory error while processing theX509object, so it may not even be related to the processed ASN1 object itself. messy.EXFLAG_NO_FINGERPRINTβ failed to compute the internal SHA1 hash value of the certificate or CRL. this may be because of a malloc failure, or because no SHA1 implementation was found. πEXFLAG_INVALID_POLICYβ theNID_certificate_policiescertificate extension is invalid or inconsistent. the certificate should be rejected. same little footnote as above: this bit may also get raised after an out-of-memory error while processing theX509object, 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 usingX509_get_key_usage().EXFLAG_XKUSAGEβ the certificate contains an extended key usage extension. the value can be retrieved usingX509_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 β 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 β each one corresponding to an individual key usage bit. if key usage is absent, then UINT32_MAX is returned.
β 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 these flags: 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 β yes, in that order, bestie, they line up. β¨
and additionally, XKU_SGC gets set if either the Netscape or Microsoft SGC OIDs are present. cute extra credit.
π 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 one's for the users who need to mark non-RFC3820 proxy certificates as such, because OpenSSL only detects the RFC3820-compliant ones. iykyk. π
π₯ X509_set_proxy_pathlen()
sets the proxy certificate path length for the given certificate x. again: for the users who need to mark non-RFC3820 proxy certificates as such, since OpenSSL only detects RFC3820 compliant ones.
π₯ X509_get_proxy_pathlen()
returns the proxy certificate path length for the given certificate x β but only if it's a proxy certificate.
π§ NOTES π§
the values of the flags correspond to extension values which are cached in the X509 structure. if the flags you get back don't give you enough info, an application should go examine the 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. slay responsibly.
if X509_get0_subject_key_id() returns NULL, then the extension may be absent or malformed. applications can figure out the precise reason using X509_get_ext_d2i().
π RETURN VALUES π
X509_get_pathlen()returns the path length value, or-1if the extension is not present.X509_get_extension_flags(),X509_get_key_usage()andX509_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 anASN1_OCTET_STRINGstructure, orNULLif 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-1otherwise.
π SEE ALSO π
π°οΈ HISTORY π°οΈ
X509_get_pathlen(), X509_set_proxy_flag(), X509_set_proxy_pathlen() and X509_get_proxy_pathlen() were added in OpenSSL 1.1.0. glow-up era. β¨
π COPYRIGHT π
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 of the License in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.
and that's the whole page, bestie!! π«Ά this was OpenSSL 3.5.9, dated 2026-09-29, manual page X509_GET_EXTENSION_FLAGS(3ossl) β thanks for reading, mwah, go check your extension flags πππ¦
π¦ where this page comes from
- fedora 43: openssl-devel 1:3.5.9-1.fc43 Β· Apache-2.0
- fedora 43: openssl-devel 1:3.5.9-1.fc43 Β· Apache-2.0
- fedora 44: openssl-devel 1:3.5.9-1.fc44 Β· Apache-2.0
- fedora 44: openssl-devel 1:3.5.9-1.fc44 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms