X509_SIGN(3ossl)

๐Ÿ“ฆ version 15.1, in freebsd 15.1

๐Ÿ’… 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 ๐ŸŒˆ

(the signers get the verifiers, it's giving balance, it's giving iconique pairing ๐Ÿ’œ)


๐Ÿ‘‘ HISTORY ๐Ÿ‘‘

  • The X509_sign(), X509_REQ_sign() and X509_CRL_sign() functions are available in all versions of OpenSSL. OG behaviour, no cap.
  • The X509_sign_ctx(), X509_REQ_sign_ctx() and X509_CRL_sign_ctx() functions were added in OpenSSL 1.0.1.
  • The X509_ACERT_sign() and X509_ACERT_sign_ctx() functions were added in OpenSSL 3.4. Newer additions, still iconic. โœจ

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