security.txt Validator
Fetch a site's security.txt and check the security contact it publishes against RFC 9116.
What this tool does
security.txt Validator takes the address of a site and asks the OmniKitly processing service to request /.well-known/security.txt from that origin. Only the scheme, host and port of what you type are used — any path or query is discarded — and when that request comes back 404 the older top-level /security.txt is tried once as a fallback. The service returns the file's "Field: value" lines grouped under their field names, together with the final URL after redirects and the HTTP status, and hands that JSON back as a download beside the report.
The grouped fields are then checked against RFC 9116, and the check goes well past the two required fields. Contact and Expires must both be present. Contact has to be an https:, mailto: or tel: URI, so a bare email address is reported as an error with the mailto: form spelled out for you. Acknowledgments, Canonical, Encryption, Hiring, Policy and CSAF must be https URIs, with dns: and openpgp4fpr: accepted only for Encryption. Expires must be an ISO 8601 timestamp, becomes an error once it has passed, and draws a warning beyond 366 days. Preferred-Languages must be a list of well-formed tags. Expires and Preferred-Languages may each appear only once, a second copy is an error, and any field name outside the registered nine is flagged as one a reader will ignore. Missing Policy, Canonical and Preferred-Languages fields come back as notes rather than faults.
What the report cannot tell you is shaped by the fetch. The service parses the file into fields before the validator ever sees it, so comment lines, blank lines, lines that are not "Field: value" at all and fields left with an empty value are dropped in transit and never raise the errors the validator holds for them. The line numbers in the table are positions in that regrouped list, not lines in the published file, and the original order of interleaved fields is gone. The PGP armour is stripped as well, so a correctly signed file still collects the note saying it is not signed; the signature itself is never verified, and the Content-Type the server replied with is not recorded anywhere. When the exact bytes matter, read the downloaded security-txt.json.
The fetch is not something a browser tab can do — a cross-origin request for someone else's /.well-known/ path would be blocked — so the address is sent to the processing service over an encrypted connection and the request is made from there under OmniKitly's own user agent. The security-txt.json and the job record are removed together once the retention window expires, six hours by default. Addresses resolving to loopback, private, carrier-grade NAT or link-local ranges are refused, as are localhost and .local, .internal, .lan and .home hostnames and any URL carrying a username and password, so an intranet host cannot be probed through it.
How to use it
- Enter the site address. A full URL with the scheme in front, such as https://example.com. A bare hostname is rejected as an invalid URL before anything is fetched, and a path is ignored — the request always goes to the origin's well-known location.
- Let the service fetch the file. Up to five redirects are followed and each hop is re-checked against the same address rules. Reading stops at 64 KB, and a hop that has not answered in about fifteen seconds is abandoned.
- Start with the verdict line. A file that was found comes back as "Valid under RFC 9116" or as a count of errors and warnings, each finding naming the field it came from. If the file is absent, the status was not 200, or nothing parsed as a field, the raw JSON is shown in place of a validation report.
- Check the fields against what you published. Contact, Expires, Policy, Encryption, Canonical, Acknowledgments and anything else the file declares are listed in a table with their values, so a stale contact or a policy URL that has since moved is visible at a glance.
Processing & privacy
Secure server processing. This operation requires temporary server processing.
Common use cases
Confirming a file you have just published
The check reads what the origin serves right now, so a rewrite rule, a CDN path or a redirect that sends /.well-known/ somewhere unexpected shows up as a non-200 status and a raw JSON dump instead of a clean report.
Catching an Expires date that has lapsed
Expires is required and is the one part of the file that goes stale on its own. A date in the past is an error that counts the days since it passed; one set more than 366 days out is a warning that the contact details will drift.
Finding out where to report a bug in someone else's site
Point it at their domain and the Contact and Policy values come back — the security contact the organisation publishes for disclosure, rather than a support address that will not route a vulnerability report.
Auditing the domains you are responsible for
Every run leaves behind the JSON it was built from, naming the final URL and status, so an apex host, its www counterpart and an old brand still pointed at your infrastructure can each be checked and kept on file.
Questions
Can I paste the contents of a security.txt file?
Is anything of mine sent anywhere?
Does it verify the PGP signature?
Where is the file supposed to live?
Does a clean result mean the file is perfect?
Can I check a staging site or an internal host?
What if the site is slow, or the path serves something enormous?
Related tools
- Meta Tag Preview — See how your title and description look in search results.
- Redirect Checker — Follow a redirect chain and see every hop.
- WCAG Contrast Checker — Test colour pairs against AA and AAA thresholds.
- Favicon Generator — Generate a full favicon set from one source image.
- Open Graph Preview — Preview how a link unfurls on social platforms.
- Social Card Preview — Check Twitter, LinkedIn and Slack card rendering.