X509_SIGN(3ossl)
๐ X509_SIGN (3ossl) โ the OpenSSL glow-up signing page ๐
okay bestie, welcome to the OpenSSL manual page for X509_SIGN(3ossl). This is the one that actually puts the โจsignatureโจ on your certificates, cert requests, and CRLs. Think of it as the final boss of "yes, this really is me" energy. ๐ซถ
โจ NAME โจ
X509_sign, X509_sign_ctx, X509_REQ_sign, X509_REQ_sign_ctx, X509_ACERT_sign, X509_ACERT_sign_ctx, X509_CRL_sign, X509_CRL_sign_ctx โ sign certificate, certificate request, or CRL signature ๐
๐ธ SYNOPSIS ๐ธ
#include <openssl/x509.h>
int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md);
int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx);
int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md);
int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx);
int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md);
int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx);
#include <openssl/x509_acert.h>
int X509_ACERT_sign(X509_ACERT *x, EVP_PKEY *pkey, const EVP_MD *md);
int X509_ACERT_sign_ctx(X509_ACERT *x, EVP_MD_CTX *ctx);
Head's up: yes, there's a second include in there โ the ACERT crew lives in <openssl/x509_acert.h>, not the regular x509 header. Don't @ me, that's just how it is. ๐
๐ฆ DESCRIPTION ๐ฆ
So X509_sign() signs certificate x using private key pkey and message digest md, and sets the signature in x. And X509_sign_ctx() also signs certificate x, but it uses the parameters contained in digest context ctx. Two roads, same destination, different vibes. ๐ซ
And listen โ if the certificate information includes X.509 extensions, these two functions make sure that the certificate bears X.509 version 3. Like, they will make it version 3. No discussion. Slay.
X509_REQ_sign(), X509_REQ_sign_ctx(), X509_ACERT_sign(), X509_ACERT_sign_ctx(), X509_CRL_sign(), and X509_CRL_sign_ctx() sign certificate requests and CRLs, respectively. Same energy, different struct. ๐
๐ NOTES ๐
X509_sign_ctx() is your girl when the default parameters for the corresponding public key and digest are not suitable. Bestie, it can be used to sign keys using RSA-PSS, for example. That's the whole point of the _ctx variant โ you bring your own context, you get control. ๐
Now the lowkey important part, so read it fr fr:
For efficiency reasons and to work around ASN.1 encoding issues, the encoding of the signed portion of a certificate, certificate request and CRL is cached internally. If the signed portion of the structure is modified, the encoding is not always updated, meaning a stale version is sometimes used.
Sounds scary? It mostly isn't โ this is not normally a problem because modifying the signed portion will invalidate the signature anyway, and signing will always update the encoding. So the stale cache can't sneak past you into something valid. Phew. ๐ฎโ๐จ
โญ RETURN VALUES โญ
All functions return the size of the signature in bytes for success and zero for failure. That's it, that's the whole thing. Non-zero bytes = you ate. Zero = something went wrong, go check your errors. ๐ฅ
๐ SEE ALSO ๐
ERR_get_error(3)X509_NAME_add_entry_by_txt(3)X509_new(3)X509_verify_cert(3)X509_verify(3)X509_REQ_verify_ex(3)X509_REQ_verify(3)X509_CRL_verify(3)
(the signers get the verifiers, it's giving balance, it's giving iconique pairing ๐)
๐ HISTORY ๐
- The
X509_sign(),X509_REQ_sign()andX509_CRL_sign()functions are available in all versions of OpenSSL. OG behaviour, no cap. - The
X509_sign_ctx(),X509_REQ_sign_ctx()andX509_CRL_sign_ctx()functions were added in OpenSSL 1.0.1. - The
X509_ACERT_sign()andX509_ACERT_sign_ctx()functions were added in OpenSSL 3.4. Newer additions, still iconic. โจ
๐ COPYRIGHT ๐
Copyright 2015-2024 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 page, babes ๐ง๐ this was OpenSSL 3.5.6, dated 2026-04-07 โ go forth and sign something gorgeous. periodt. ๐ ๐ธ
๐ฆ where this page comes from
- freebsd 15.1: base 15.1
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms