Skip to main content

    Certificate Linting: The Check That Runs Before a Certificate Is Signed

    Pre-issuance linting has been mandatory for publicly trusted TLS certificates since 15 March 2025. What gets checked, which linters CAs run, and why.

    DR
    Daniel Rehak
    ·
    12 min read
    ·
    Published September 20, 2026
    ·
    Last updated September 20, 2026

    The short answer

    Certificate linting is an automated conformance check that a certificate authority runs against a certificate's contents before it signs them. Under Section 4.3.1.2 of the CA/Browser Forum TLS Baseline Requirements, every publicly trusted CA has been obliged to run one since 15 March 2025; the S/MIME equivalent became mandatory on 15 September 2025. The reasoning is arithmetic rather than philosophical. A defect caught before the signature costs one rejected order. The same defect caught after it is a misissuance, and Section 4.9.1.1 obliges the CA to revoke the certificate within 5 days.

    Where the lint gate sits in the certificate issuance pipelineA flow running left to right. Order data and the certificate signing request feed into a to-be-signed certificate, which reaches a gold gate labelled lint. The gate has two exits. The pass exit leads up to signing, the precertificate, Certificate Transparency logs and an issued certificate. The fail exit leads down to a box reading issuance blocked, nothing reaches a relying party. A band across the bottom states that the same defect found before the signature costs one rejected order, while after the signature the Baseline Requirements oblige the certificate authority to revoke within five days.The gate sits before the signature. That placement is the whole point.ORDER DATA+ your CSRASSEMBLEDtbsCertificateLINTconformancecheckpassSIGNprecertificate to CT logs,certificate to youfailISSUANCE BLOCKEDnothing reaches arelying partySame defect, either side of the signature:before it, one rejected order — after it, the CA must revoke within 5 days (Baseline Requirements 4.9.1.1)
    A linter needs something to parse, and an unsigned certificate is not yet a certificate. The three ways a CA gets around that are the subject of the next figure.

    What certificate linting is

    Linting is a conformance check run by a program rather than a person. The Baseline Requirements define it as a process in which the content of signed data — a precertificate, a certificate, a CRL, an OCSP response — or of data-to-be-signed such as a tbsCertificate is checked for conformance with the profiles and requirements in those Requirements. A linter is a collection of small, independent rules. One checks that a required extension is present. Another checks that a DNS name parses. Another checks a key length.

    The word is borrowed from software development, and the analogy holds up. A code linter reads your source and tells you which lines break the house rules before you ship them. A certificate linter reads a certificate and tells you which fields break the Baseline Requirements, RFC 5280, or a root program's policy before anyone trusts them.

    What makes it necessary is the size of the rulebook. A publicly trusted TLS certificate has to satisfy the certificate profile in Section 7.1 of the Baseline Requirements, the X.509 profile in RFC 5280, and the policies of every root program that trusts the issuing CA. The Requirements say as much themselves: they introduce the linting section by citing the complexity involved in implementing conformant certificate profiles. This is a rule written by people who had watched CAs get it wrong.

    When did certificate linting become mandatory?

    For publicly trusted TLS certificates, on 15 March 2025. Section 4.3.1.2 of the TLS Baseline Requirements describes linting as best practice and then adds one sentence with teeth: effective 2025-03-15, the CA SHALL implement such a linting process. The rule arrived through Ballot SC-75, Pre-sign linting, adopted on 28 June 2024 and carried into Baseline Requirements v2.0.6 on 6 August 2024. The nine-month gap between the ballot and the effective date was the implementation window.

    S/MIME followed a staged path of its own under ballot SMC09, and code signing did not follow at all. The table below is the current state across the three Baseline Requirements documents, as of September 2026.

    DocumentRequirementLevelEffective
    TLS BR (v2.3.0)§4.3.1.2 — lint each to-be-signed artifactSHALL2025-03-15
    TLS BR (v2.3.0)§8.7 — lint the quarterly self-audit sampleSHOULD2025-03-15
    TLS BR (v2.3.0)§4.3.1.3 — lint issued certificatesMAY
    S/MIME BR (v1.0.15)§4.3.1.2 — pre-issuance lintingSHOULD2025-03-15
    S/MIME BR (v1.0.15)§4.3.1.2 — pre-issuance lintingSHALL2025-09-15
    Code Signing BR (v3.11.0)No linting requirement in the document

    That last row is worth a second look, because it is easy to assume the rule is universal. Version 3.11.0 of the Code Signing Baseline Requirements, dated 16 June 2026, does not mention linting anywhere. Code signing certificates are not exempt from being well-formed — they still have a profile to meet — but no ballot has yet made the check itself compulsory for them. Linters have run ahead of the rulebook here: zlint already ships a dedicated CABF_CS_BR rule source for code signing certificates, which CAs may use whether or not a document obliges them to.

    Why does the check sit before the signature?

    Because a signature is the point of no return. Before the CA signs, a malformed certificate is a draft and the worst outcome is a rejected order. After it signs, the certificate exists, a subscriber may deploy it, and the defect is a misissuance. The Baseline Requirements price that difference explicitly. Reason 12 in Section 4.9.1.1 covers a certificate the CA becomes aware was not issued in accordance with the Requirements, and the clock it starts is short: the CA should revoke within 24 hours and must revoke within 5 days.

    Five days is not a long time to notify a subscriber, help them reissue, and replace a certificate on live infrastructure. It is the reason mass-revocation incidents have the shape they do: thousands of subscribers given a few days' notice because a single field in a single profile was wrong. Every one of those incidents is a case that pre-issuance linting is designed to catch while it is still cheap.

    The asymmetry also explains why the Requirements treat the two directions so differently. Section 4.3.1.2 makes pre-issuance linting a SHALL. Section 4.3.1.3, linting of issued certificates, remains a MAY. Checking afterwards is useful for finding what you missed, and Section 8.7 recommends it for the quarterly self-audit sample, but it cannot prevent anything. Only the earlier check can.

    One operational detail rarely gets mentioned and is worth knowing: linters themselves are moving targets. Section 6.6.1 says that a CA using third-party linting software should monitor for updates and plan to adopt them no later than three months after release. New rules appear in zlint and pkilint as ballots pass, so a CA running a year-old linter is checking against a year-old rulebook.

    How do you lint a certificate that has not been signed yet?

    You build a certificate-shaped object the linter can parse, without that object being trustworthy. This is the part of the requirement that sounds contradictory on first reading: linters take certificates as input, and the whole point of pre-issuance linting is that no certificate exists yet. The Baseline Requirements resolve it by naming two acceptable ways to manufacture a stand-in, and by carving out a third route through Certificate Transparency.

    Three ways a certificate authority produces an artifact a linter can parse before real signingThree panels side by side. The first, dummy private key, signs the to-be-signed certificate with a key that chains to nothing publicly trusted. The second, static signature value, puts a fixed placeholder in the certificate's signature field. The third, outlined in gold, is the precertificate: linting it lets the certificate authority skip linting the real certificate, but only where a technical control confirms the two correspond as described in RFC 6962 Section 3.2.A linter parses certificates. So the CA builds one that is deliberately worthless.1 — DUMMY PRIVATE KEYSign the tbsCertificatewith a key whose publichalf chains to nothingpublicly trusted.Parseable, never valid.2 — STATIC SIGNATUREPut a fixed placeholderin the certificate'ssignaturefield and lint that.No signing key touched.3 — PRECERTIFICATELint the CT precert andskip the real one — onlywith a control provingthe two correspond.RFC 6962 §3.2.Routes 1 and 2 are the two methods named in Baseline Requirements 4.3.1.2. Route 3 is the exemption in the same section,and it is conditional: without the correspondence control, the to-be-signed certificate has to be linted on its own.
    Route 3 is the one to read carefully. Linting only the precertificate is permitted, not automatic — it depends on a control most people never see.

    The first method signs the tbsCertificate with a dummy private key whose public key is not certified by any certificate chaining to a publicly trusted CA. The result parses as a certificate and fails any trust check, which is exactly what is wanted. The second specifies a static value for the signature field of the certificate's ASN.1 sequence — the structure is complete, the signature is a placeholder, and the CA's real signing key is never involved.

    The third route is the precertificate, and it comes with a condition worth reading twice. Where a precertificate has already been linted, the corresponding to-be-signed certificate does not have to be linted again — provided the CA has a technical control that verifies the to-be-signed certificate corresponds to the to-be-signed precertificate in the manner described by RFC 6962 Section 3.2. Without that control, the exemption does not apply. The permission and its condition live in the same sentence, which is a detail that summaries of this rule routinely drop.

    Which linters do certificate authorities actually run?

    Four general-purpose linters do most of the work, and most CAs run more than one. The Baseline Requirements permit a CA to implement its own tooling but say it should use the linting tools widely adopted by the industry, pointing at the CA/Browser Forum's own tools page. The Requirements also encourage CAs to contribute back: writing new lints, reporting inaccurate results as bugs, and generating test certificates for specific rules.

    LinterMaintained byRule sources it covers
    zlintZMap project (Go)TLS, S/MIME and code signing Baseline Requirements, EV Guidelines, RFC 5280 and related RFCs, plus Mozilla, Apple and Chrome root policies and ETSI
    pkilintDigiCert (Python)PKIX, TLS and S/MIME Baseline Requirements, ETSI EN 319 412 and TS 119 495, CRLs and OCSP responses
    x509lintKurt RoeckxTLS Baseline Requirements, RFC 5280
    certlintcertlint projectTLS Baseline Requirements, RFC 5280

    Coverage differs between them, which is why running one is usually not enough. A rule implemented in pkilint may have no counterpart in zlint, and the reverse happens too. That is the problem pkimetal was built to solve. It runs certlint, pkilint, x509lint and zlint behind a single REST API, detects the intended profile of whatever you hand it, and normalises the findings into one response format. It also adds special-purpose checkers that the general linters do not include: Debian weak keys, ROCA keys, mojibake in text fields, and browser CT policy compliance in precertificates.

    A caution the pkimetal maintainers publish themselves is worth repeating, because it is a good example of how far SC-75 reaches. Public hosted instances of the meta-linter exist, but they are not recommended for production use by a CA — because the ballot may cause an external linting service to be treated as a Delegated Third Party, with the audit obligations that carries. A CA is expected to run its own deployment. For a site owner checking a certificate they already hold, none of that applies.

    How do you read a lint result?

    Each rule returns a status rather than a simple pass or fail, and only two of the statuses mean the certificate is wrong. zlint reports seven: NA when the rule does not apply to this kind of certificate, NE when it is not yet effective, then Pass, Notice, Warn, Error and Fatal. Error means a rule was broken. Fatal means the lint itself could not complete.

    The seven zlint result statuses and which of them indicate a conformance failureSeven labelled chips in a row: not applicable, not effective, pass, notice, warn, error and fatal. A grey bracket beneath the first five marks them as reported but not a conformance failure. A gold bracket beneath error and fatal marks them as the pair that indicates a real problem. A note underneath explains the naming rule: a lint whose name begins with e underscore may only return error, and one beginning with w underscore may only return warn.Seven statuses. Only two of them mean the certificate is wrong.NAno applyNEnot yetPasscleanNoticefor infoWarnreview itErrorbreaks a ruleFatallint crashedreported, but not a conformance failurethe pair that mattersYou can predict the severity from the name:a lint called e_something may only return Error · a lint called w_something may only return Warn
    NE is the status that trips people up. It means the rule exists but does not apply to that certificate's notBefore date — not that the certificate passed it.

    NE, Not Effective, is the status most often misread. Rules in zlint carry an effective date and sometimes an ineffective date, and a certificate whose notBefore falls outside that range gets NE rather than Pass. It is the linter saying the rule did not exist yet for this certificate, which is not the same as the certificate satisfying it. When you lint an older certificate and see a wall of NE results, that is the Web PKI's rulebook growing, recorded one rule at a time.

    The naming convention lets you predict severity before you run anything. A lint whose name begins with e_ may only return Error, never Warn; one beginning with w_ may only return Warn, never Error. So e_subject_common_name_not_from_san is a rule its authors consider a hard requirement, and a w_ rule is advice. What a CA does with each status is its own policy decision — the Baseline Requirements mandate that a linting process exists, not which findings must block issuance.

    What certificate linting changes for you

    Mostly it means fewer surprises, and one new kind of no. Linting is a control inside the CA, so on a normal order you will never see it run. Where it becomes visible is at the edges: a request that would once have been issued and quietly revoked weeks later now fails at submission instead, and the answer is final in a way it did not used to be. A CA cannot waive a lint failure as a favour, because issuing anyway would be the misissuance the check exists to prevent.

    Three practical consequences follow. Organization details matter more than they did, because subject fields carrying a company name, locality and country are checked for internal consistency as well as accuracy — that mostly affects OV certificates, where verified organization data goes into the subject, and EV certificates, which add more fields still. Names in a CSR are checked for syntactic validity, so an internal hostname or an underscore that a private CA would accept will not survive. And a certificate profile your automation has produced happily for years can start failing after a ballot changes a rule, with nothing on your side having changed at all.

    If you run your own internal CA, the tooling is worth borrowing regardless of whether any rule applies to you. zlint and pkilint are open source, both run locally against a certificate file, and pointing them at your internal issuance output is a cheap way to find profile mistakes that would otherwise surface as a client that refuses to connect. The public rulebook is stricter than most internal ones, so expect findings you can legitimately ignore — and read the NE results before you treat them as clean.

    Frequently Asked Questions

    Get instant answers to common questions about SSL certificates and our services.

    Still Have Questions?

    Our SSL experts are available 24/7 to help with any questions about certificates, installation, or technical issues.

    Before your next order

    Most lint failures a subscriber ever meets come down to what went into the request: a name that will not validate, or organization details that do not match the record a CA is required to check them against. Both are easier to get right before you order than after. Compare what DV, OV and EV certificates put in the subject so you know which fields your request will be judged on.

    Related reading