DKIM Record Checker

Read a DKIM key record and get the key size out of the key itself, plus the two settings that turn DKIM off while leaving it looking configured: an empty p, which is a revocation, and t=y, which asks verifiers to ignore failures.

Paste below, or drop a file anywhere on this panel

Or drop a file anywhere on this panel. Nothing is uploaded: the analysis runs in this tab.

The answer appears here

Paste on the left and press Check the record. Nothing leaves this tab.

Wanted a different tool?

  • DMARC Record Checker because DKIM alone enforces nothing: DMARC is what turns a failed signature into a delivery decision.
  • DNS Record Checker if the record is not resolving at all, since a long key is several TXT strings and rejoining them wrongly is the usual cause.
  • SPF Record Checker because SPF and DKIM are the two signals DMARC aligns against, and the ten lookup limit is where SPF stops working.

Examples

Real input you can load into the tool above. Each one shows a different thing going wrong, because that is what the tool is for.

An empty p

Not a missing value: RFC 6376 defines it as a revocation, so every signature under this selector fails

v=DKIM1; k=rsa; p=

A 1024-bit key

The size is read out of the key itself, and 1024 verifies everywhere, which is why so many are still published

v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCem894SdsUExGt2O8IBiA95grNiyHUbQE4lU43Zd+WJGeesDefAgEVosN7c9JkDFms689P0ZHf0M3Qm/Hd7JOlBkB+iCet0pLoIF2F06WVluuUj5rYKtrreHEUu6qeFDr57otmiDIaPi3Ws8KkVHeXs9f8x1LmbF8Im6NlfqmEqwIDAQAB

Testing mode left in

t=y asks verifiers to ignore failures, so DKIM is configured, visible, and enforcing nothing

v=DKIM1; k=rsa; t=y; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5bV2Kvuw5gYjvwMmnwAzSjH3ptZnEAi12Mma2a6Nx1J/UDOnVsyxk2gXMAjc42za3Lx0sLwntuIS8/rZ5nAXutacGS8fe4zkQjtnehPmoCi4ZMLoRaQh04rcyCmRuj8DYaswXtX2nnisw5p+6OtSIS3/fWyF8hJe/sfFlZfokm5vGFfBqD1jb7xPfHzgP1XiJiRhoUdPo0jFJImMJLVJgRvxwEHTcVmvyMqfviH0ihlRdUkxvBXDS6OqDWZqS+fU7bp+e5njfXNJu4szE9D4V5n2jpYyL6hkXxxKZUGXA3GxXgSLJszchwf0CKiLWWbW56Mx+MrGU51zCEnuEH0bQIDAQAB

A private key in DNS

The bytes decode and are not a SubjectPublicKeyInfo, which is what a pasted private key looks like from here

v=DKIM1; k=rsa; p=aGVsbG8gd29ybGQ=

Common mistakes

These are the ones that fail silently. The config is accepted, nothing raises an error, and the consequence arrives later.

  1. Reading an empty `p=` as a missing value

    RFC 6376 defines a key record with an empty p as REVOKED. A verifier does not conclude the record is incomplete, it concludes the key was withdrawn and fails every signature made with that selector. A trimmed value in a DNS interface publishes a revocation that looks like a typo.

    Instead:Republish the full key if the selector is still in use. If it is genuinely retired, the empty record is the correct way to say so and the signer should stop using it.

  2. Leaving `t=y` in after the rollout

    Testing mode asks verifiers not to act on a DKIM failure. The record exists, the signature is attached, and every check that asks whether DKIM is configured says yes, while nothing is enforced.

    Instead:Remove it once signatures are verifying in the DMARC aggregate reports. It belongs in the first day and nowhere after.

  3. Rejoining a split key with a space

    A key over 255 bytes is published as several TXT strings, and the resolver concatenates them with nothing in between. A separator that survives into the value corrupts the base64, and the chunk boundary lands wherever 255 bytes falls, as often inside a tag name as inside the key.

    Instead:Join the quoted strings with nothing. Whitespace inside the base64 is permitted by the RFC and stripped before decoding; a character that is not base64 is not.

  4. Publishing an Ed25519 key on its own

    RFC 8463 defines ed25519-sha256 and support is far from universal. A receiver that does not implement it has a signature it cannot verify, which under a strict DMARC policy with no SPF alignment means the message does not arrive.

    Instead:Publish an RSA key under a second selector and sign with both. A verifier uses whichever it understands and ignores the other.

The two ways a DKIM record enforces nothing while looking correct

A record with a key in it and a green tick in every setup checker can still be doing no work at all. Both of the ways that happens are one character of difference, and neither produces an error anywhere.

An empty p= is a revocation, not a missing value

RFC 6376 section 3.6.1 defines a key record with an empty p as a revoked key. A verifier that reads it does not conclude the record is incomplete, it concludes the key was withdrawn and treats every signature made with that selector as a failure. So a DNS interface that trimmed the long value, or a copy-paste that lost the tail, publishes a revocation that looks like a typo. This is the one worth checking first, because nothing about it looks broken.

v=DKIM1; k=rsa; p=MIIBIjANBg...   the key
v=DKIM1; k=rsa; p=                 revoked
v=DKIM1; k=rsa                     no key at all

t=y asks verifiers to ignore failures

Testing mode tells a verifier not to treat a DKIM failure as a reason to act. The record exists, the signature is attached, DNS looks right, and none of it is enforcing anything. It belongs in the first day of a rollout, and it is routinely left in for years because every check that only asks whether DKIM is configured says yes.

The key size is in the key, so no lookup is needed to read it

The p tag is base64 of a SubjectPublicKeyInfo, which is the same structure inside a TLS certificate. The RSA modulus is in there, so the key length is readable from the record itself. RFC 8301 requires verifiers to reject anything under 1024 bits and tells signers to use 2048. 1024-bit keys are still widely published, precisely because nothing breaks and nothing complains.

1024 bits   verifies everywhere, and is the one to rotate
2048 bits   what RFC 8301 says to sign with
4096 bits   needs splitting across TXT strings, and not every
            verifier reads it

A long key is several TXT strings, joined with nothing

A single character-string in a TXT record cannot exceed 255 bytes, and a 2048-bit key does not fit. So it is published as several quoted strings, and the resolver concatenates them with nothing in between. Rejoining them with a space or a newline corrupts the key, and the chunk boundary lands wherever 255 bytes falls, which is as often inside a tag name as inside the base64.

"v=DKIM1; k=rsa; p=MIIBIjANBgkq" "hkiG9w0BAQEFAAOCAQ8A..."
                              ^ joined with nothing

k= and the key have to agree

The verifier reads k to decide how to interpret the bytes in p. When they disagree, verification fails for a reason the record explains and nothing in a bounce message will. Ed25519 is worth publishing and not worth publishing alone: RFC 8463 defines it and support is far from universal, so a receiver that does not implement it has a signature it cannot check. Sign with both, under two selectors.

What this cannot see

This is the key half. Whether a message verifies also depends on the signature your mail server attaches, which is not in DNS: the headers it covers, whether the body was modified in transit by a mailing list or a scanner, and whether the d= domain aligns with the From header for DMARC. None of that is visible in the record. It also performs no lookup, so it cannot tell you the record is published, that the selector matches the one your signer uses, or that the private key still pairs with this public one.