b2KIT

security.txt Generator

Generate RFC 9116 compliant security.txt files with contact, encryption, acknowledgments, and policy fields.

Tested tool guide Tested browser tools Checked August 16, 2026

What security.txt Generator does, with a checked example

RFC 9116 gives vulnerability researchers one standardized place to look: /.well-known/security.txt. This tool writes that file for you. You fill in a contact email or URL, an expiry date, and optional fields (encryption key, disclosure policy, acknowledgments, preferred languages, hiring), and it renders the exact field: value text the standard specifies, converting bare emails to mailto: URIs and calendar dates to RFC 3339 timestamps. Everything runs in the browser, so your contact details never leave the machine. What users underestimate: generating the text is the easy part. Serving it at the well-known path over HTTPS, and renewing the mandatory Expires field every year, is where disclosure channels actually fail.

Worked example

A concrete input and expected output from the current implementation.

Input

Contact: [email protected], Expires: December 31, 2026, Preferred-Languages: en

Expected output

Contact: mailto:[email protected]
Expires: 2026-12-31T00:00:00Z
Preferred-Languages: en

RFC 9116 requires Contact to be a URI, so the bare email becomes mailto:[email protected]. Expires must be a full RFC 3339 date-time, so the chosen calendar date is rendered as 2026-12-31T00:00:00Z (midnight UTC), which is the correct timestamp for that date. Both mandatory fields are present, and each line uses the standard's Field: value syntax.

How the result is produced

1

Form fields to field lines

Each form entry becomes one line of the file. Contact, Encryption, Acknowledgments, Policy, Canonical, and Hiring take URIs, and a bare email entered in Contact gets the mailto: prefix the RFC requires, since plain addresses are not valid values. Preferred-Languages is rendered as a comma-separated language list, and every line uses the standard's Field: value syntax with a colon and space, so the output parses cleanly against the RFC's grammar.

2

Expires and the mandatory pair

RFC 9116 requires Contact and Expires in every file, so a compliant generator keeps both in view. The expiry you pick is rendered as a full RFC 3339 timestamp with a timezone, because a bare date like 2026-12-31 does not satisfy the spec. The standard also caps Expires at one year ahead, which forces the yearly renewal most disclosure channels forget.

Good uses

  • Standing up a disclosure channel for a new domain or product: generate the file during launch work, then deploy it to /.well-known/security.txt so researchers have a defined destination.
  • Replacing a draft-era or hand-written security.txt: the final RFC tightened value types, URIs instead of free text and timestamps instead of dates, and regenerating brings your file in line with what current crawlers and validators expect.
  • Annual maintenance: regenerate before Expires rolls past, and use the occasion to update the contact alias, rotate PGP keys, or add a policy and acknowledgments page once a coordinated-disclosure program matures.

Limits and checks

  • Generation is not deployment. The tool emits text; you still have to place it at /.well-known/security.txt on your own server, served over HTTPS as text/plain, and a browser-local generator cannot verify that delivery actually works from outside your network.
  • The file expires by design. With a mandatory Expires capped one year ahead, anything you generate today quietly goes stale; a past-due file is treated as abandoned, and an unmonitored contact mailbox makes even a fresh one worthless.
  • Compliance is about structure, not reachability. A PGP key URL that 404s, an acknowledgments page behind a login, or a contact alias nobody reads still produces a perfectly valid file, so check every URI you enter as if a stranger will click it.

Common questions

Why does Expires need a timezone, and why only one year ahead?

RFC 9116 defines Expires as an RFC 3339 date-time, so a plain date like 2026-12-31 is not a valid value; the generator renders the date you pick as a timestamp such as 2026-12-31T00:00:00Z. The one-year cap exists to force a periodic review, so plan to revisit the file yearly.

Where exactly does the generated file go?

It belongs at https://yourdomain/.well-known/security.txt, and the well-known path is the whole point of the standard. Many servers also redirect requests from /security.txt to it, but you publish the file yourself; the tool cannot place it for you. After publishing, fetch the URL from outside your network and confirm it returns the file as text/plain.

References and verification

The example and behavioral notes were checked against the browser implementation. Standards and primary references below define the relevant format, formula, or platform behavior.

Related Tools