4260 lines
173 KiB
Plaintext
4260 lines
173 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
Internet Engineering Task Force (IETF) D. Crocker, Ed.
|
||
Request for Comments: 6376 Brandenburg InternetWorking
|
||
Obsoletes: 4871, 5672 T. Hansen, Ed.
|
||
Category: Standards Track AT&T Laboratories
|
||
ISSN: 2070-1721 M. Kucherawy, Ed.
|
||
Cloudmark
|
||
September 2011
|
||
|
||
|
||
DomainKeys Identified Mail (DKIM) Signatures
|
||
|
||
Abstract
|
||
|
||
DomainKeys Identified Mail (DKIM) permits a person, role, or
|
||
organization that owns the signing domain to claim some
|
||
responsibility for a message by associating the domain with the
|
||
message. This can be an author's organization, an operational relay,
|
||
or one of their agents. DKIM separates the question of the identity
|
||
of the Signer of the message from the purported author of the
|
||
message. Assertion of responsibility is validated through a
|
||
cryptographic signature and by querying the Signer's domain directly
|
||
to retrieve the appropriate public key. Message transit from author
|
||
to recipient is through relays that typically make no substantive
|
||
change to the message content and thus preserve the DKIM signature.
|
||
|
||
This memo obsoletes RFC 4871 and RFC 5672.
|
||
|
||
Status of This Memo
|
||
|
||
This is an Internet Standards Track document.
|
||
|
||
This document is a product of the Internet Engineering Task Force
|
||
(IETF). It represents the consensus of the IETF community. It has
|
||
received public review and has been approved for publication by the
|
||
Internet Engineering Steering Group (IESG). Further information on
|
||
Internet Standards is available in Section 2 of RFC 5741.
|
||
|
||
Information about the current status of this document, any errata,
|
||
and how to provide feedback on it may be obtained at
|
||
http://www.rfc-editor.org/info/rfc6376.
|
||
|
||
Copyright Notice
|
||
|
||
Copyright (c) 2011 IETF Trust and the persons identified as the
|
||
document authors. All rights reserved.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 1]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
This document is subject to BCP 78 and the IETF Trust's Legal
|
||
Provisions Relating to IETF Documents
|
||
(http://trustee.ietf.org/license-info) in effect on the date of
|
||
publication of this document. Please review these documents
|
||
carefully, as they describe your rights and restrictions with respect
|
||
to this document. Code Components extracted from this document must
|
||
include Simplified BSD License text as described in Section 4.e of
|
||
the Trust Legal Provisions and are provided without warranty as
|
||
described in the Simplified BSD License.
|
||
|
||
This document may contain material from IETF Documents or IETF
|
||
Contributions published or made publicly available before November
|
||
10, 2008. The person(s) controlling the copyright in some of this
|
||
material may not have granted the IETF Trust the right to allow
|
||
modifications of such material outside the IETF Standards Process.
|
||
Without obtaining an adequate license from the person(s) controlling
|
||
the copyright in such materials, this document may not be modified
|
||
outside the IETF Standards Process, and derivative works of it may
|
||
not be created outside the IETF Standards Process, except to format
|
||
it for publication as an RFC or to translate it into languages other
|
||
than English.
|
||
|
||
Table of Contents
|
||
|
||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4
|
||
1.1. DKIM Architecture Documents . . . . . . . . . . . . . . . 5
|
||
1.2. Signing Identity . . . . . . . . . . . . . . . . . . . . . 5
|
||
1.3. Scalability . . . . . . . . . . . . . . . . . . . . . . . 5
|
||
1.4. Simple Key Management . . . . . . . . . . . . . . . . . . 6
|
||
1.5. Data Integrity . . . . . . . . . . . . . . . . . . . . . . 6
|
||
2. Terminology and Definitions . . . . . . . . . . . . . . . . . 6
|
||
2.1. Signers . . . . . . . . . . . . . . . . . . . . . . . . . 6
|
||
2.2. Verifiers . . . . . . . . . . . . . . . . . . . . . . . . 7
|
||
2.3. Identity . . . . . . . . . . . . . . . . . . . . . . . . . 7
|
||
2.4. Identifier . . . . . . . . . . . . . . . . . . . . . . . . 7
|
||
2.5. Signing Domain Identifier (SDID) . . . . . . . . . . . . . 7
|
||
2.6. Agent or User Identifier (AUID) . . . . . . . . . . . . . 7
|
||
2.7. Identity Assessor . . . . . . . . . . . . . . . . . . . . 7
|
||
2.8. Whitespace . . . . . . . . . . . . . . . . . . . . . . . . 8
|
||
2.9. Imported ABNF Tokens . . . . . . . . . . . . . . . . . . . 8
|
||
2.10. Common ABNF Tokens . . . . . . . . . . . . . . . . . . . . 9
|
||
2.11. DKIM-Quoted-Printable . . . . . . . . . . . . . . . . . . 9
|
||
3. Protocol Elements . . . . . . . . . . . . . . . . . . . . . . 10
|
||
3.1. Selectors . . . . . . . . . . . . . . . . . . . . . . . . 10
|
||
3.2. Tag=Value Lists . . . . . . . . . . . . . . . . . . . . . 12
|
||
3.3. Signing and Verification Algorithms . . . . . . . . . . . 13
|
||
3.4. Canonicalization . . . . . . . . . . . . . . . . . . . . . 14
|
||
3.5. The DKIM-Signature Header Field . . . . . . . . . . . . . 18
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 2]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
3.6. Key Management and Representation . . . . . . . . . . . . 26
|
||
3.7. Computing the Message Hashes . . . . . . . . . . . . . . . 29
|
||
3.8. Input Requirements . . . . . . . . . . . . . . . . . . . . 32
|
||
3.9. Output Requirements . . . . . . . . . . . . . . . . . . . 32
|
||
3.10. Signing by Parent Domains . . . . . . . . . . . . . . . . 33
|
||
3.11. Relationship between SDID and AUID . . . . . . . . . . . . 33
|
||
4. Semantics of Multiple Signatures . . . . . . . . . . . . . . . 34
|
||
4.1. Example Scenarios . . . . . . . . . . . . . . . . . . . . 34
|
||
4.2. Interpretation . . . . . . . . . . . . . . . . . . . . . . 35
|
||
5. Signer Actions . . . . . . . . . . . . . . . . . . . . . . . . 36
|
||
5.1. Determine Whether the Email Should Be Signed and by
|
||
Whom . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
|
||
5.2. Select a Private Key and Corresponding Selector
|
||
Information . . . . . . . . . . . . . . . . . . . . . . . 37
|
||
5.3. Normalize the Message to Prevent Transport Conversions . . 37
|
||
5.4. Determine the Header Fields to Sign . . . . . . . . . . . 38
|
||
5.5. Compute the Message Hash and Signature . . . . . . . . . . 43
|
||
5.6. Insert the DKIM-Signature Header Field . . . . . . . . . . 43
|
||
6. Verifier Actions . . . . . . . . . . . . . . . . . . . . . . . 43
|
||
6.1. Extract Signatures from the Message . . . . . . . . . . . 44
|
||
6.2. Communicate Verification Results . . . . . . . . . . . . . 49
|
||
6.3. Interpret Results/Apply Local Policy . . . . . . . . . . . 50
|
||
7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 51
|
||
7.1. Email Authentication Methods Registry . . . . . . . . . . 51
|
||
7.2. DKIM-Signature Tag Specifications . . . . . . . . . . . . 51
|
||
7.3. DKIM-Signature Query Method Registry . . . . . . . . . . . 52
|
||
7.4. DKIM-Signature Canonicalization Registry . . . . . . . . . 52
|
||
7.5. _domainkey DNS TXT Resource Record Tag Specifications . . 53
|
||
7.6. DKIM Key Type Registry . . . . . . . . . . . . . . . . . . 53
|
||
7.7. DKIM Hash Algorithms Registry . . . . . . . . . . . . . . 54
|
||
7.8. DKIM Service Types Registry . . . . . . . . . . . . . . . 54
|
||
7.9. DKIM Selector Flags Registry . . . . . . . . . . . . . . . 55
|
||
7.10. DKIM-Signature Header Field . . . . . . . . . . . . . . . 55
|
||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 55
|
||
8.1. ASCII Art Attacks . . . . . . . . . . . . . . . . . . . . 55
|
||
8.2. Misuse of Body Length Limits ("l=" Tag) . . . . . . . . . 55
|
||
8.3. Misappropriated Private Key . . . . . . . . . . . . . . . 56
|
||
8.4. Key Server Denial-of-Service Attacks . . . . . . . . . . . 56
|
||
8.5. Attacks against the DNS . . . . . . . . . . . . . . . . . 57
|
||
8.6. Replay/Spam Attacks . . . . . . . . . . . . . . . . . . . 57
|
||
8.7. Limits on Revoking Keys . . . . . . . . . . . . . . . . . 58
|
||
8.8. Intentionally Malformed Key Records . . . . . . . . . . . 58
|
||
8.9. Intentionally Malformed DKIM-Signature Header Fields . . . 58
|
||
8.10. Information Leakage . . . . . . . . . . . . . . . . . . . 58
|
||
8.11. Remote Timing Attacks . . . . . . . . . . . . . . . . . . 59
|
||
8.12. Reordered Header Fields . . . . . . . . . . . . . . . . . 59
|
||
8.13. RSA Attacks . . . . . . . . . . . . . . . . . . . . . . . 59
|
||
8.14. Inappropriate Signing by Parent Domains . . . . . . . . . 59
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 3]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
8.15. Attacks Involving Extra Header Fields . . . . . . . . . . 60
|
||
9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 61
|
||
9.1. Normative References . . . . . . . . . . . . . . . . . . . 61
|
||
9.2. Informative References . . . . . . . . . . . . . . . . . . 62
|
||
Appendix A. Example of Use (INFORMATIVE) . . . . . . . . . . . . 64
|
||
A.1. The User Composes an Email . . . . . . . . . . . . . . . . 64
|
||
A.2. The Email is Signed . . . . . . . . . . . . . . . . . . . 65
|
||
A.3. The Email Signature is Verified . . . . . . . . . . . . . 66
|
||
Appendix B. Usage Examples (INFORMATIVE) . . . . . . . . . . . . 67
|
||
B.1. Alternate Submission Scenarios . . . . . . . . . . . . . . 67
|
||
B.2. Alternate Delivery Scenarios . . . . . . . . . . . . . . . 69
|
||
Appendix C. Creating a Public Key (INFORMATIVE) . . . . . . . . . 71
|
||
C.1. Compatibility with DomainKeys Key Records . . . . . . . . 72
|
||
C.2. RFC 4871 Compatibility . . . . . . . . . . . . . . . . . . 73
|
||
Appendix D. MUA Considerations (INFORMATIVE) . . . . . . . . . . 73
|
||
Appendix E. Changes since RFC 4871 . . . . . . . . . . . . . . . 73
|
||
Appendix F. Acknowledgments . . . . . . . . . . . . . . . . . . . 75
|
||
|
||
1. Introduction
|
||
|
||
DomainKeys Identified Mail (DKIM) permits a person, role, or
|
||
organization to claim some responsibility for a message by
|
||
associating a domain name [RFC1034] with the message [RFC5322], which
|
||
they are authorized to use. This can be an author's organization, an
|
||
operational relay, or one of their agents. Assertion of
|
||
responsibility is validated through a cryptographic signature and by
|
||
querying the Signer's domain directly to retrieve the appropriate
|
||
public key. Message transit from author to recipient is through
|
||
relays that typically make no substantive change to the message
|
||
content and thus preserve the DKIM signature. A message can contain
|
||
multiple signatures, from the same or different organizations
|
||
involved with the message.
|
||
|
||
The approach taken by DKIM differs from previous approaches to
|
||
message signing (e.g., Secure/Multipurpose Internet Mail Extensions
|
||
(S/MIME) [RFC5751], OpenPGP [RFC4880]) in that:
|
||
|
||
o the message signature is written as a message header field so that
|
||
neither human recipients nor existing MUA (Mail User Agent)
|
||
software is confused by signature-related content appearing in the
|
||
message body;
|
||
|
||
o there is no dependency on public- and private-key pairs being
|
||
issued by well-known, trusted certificate authorities;
|
||
|
||
o there is no dependency on the deployment of any new Internet
|
||
protocols or services for public-key distribution or revocation;
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 4]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
o signature verification failure does not force rejection of the
|
||
message;
|
||
|
||
o no attempt is made to include encryption as part of the mechanism;
|
||
and
|
||
|
||
o message archiving is not a design goal.
|
||
|
||
DKIM:
|
||
|
||
o is compatible with the existing email infrastructure and
|
||
transparent to the fullest extent possible;
|
||
|
||
o requires minimal new infrastructure;
|
||
|
||
o can be implemented independently of clients in order to reduce
|
||
deployment time;
|
||
|
||
o can be deployed incrementally; and
|
||
|
||
o allows delegation of signing to third parties.
|
||
|
||
1.1. DKIM Architecture Documents
|
||
|
||
Readers are advised to be familiar with the material in [RFC4686],
|
||
[RFC5585], and [RFC5863], which provide the background for the
|
||
development of DKIM, an overview of the service, and deployment and
|
||
operations guidance and advice, respectively.
|
||
|
||
1.2. Signing Identity
|
||
|
||
DKIM separates the question of the identity of the Signer of the
|
||
message from the purported author of the message. In particular, a
|
||
signature includes the identity of the Signer. Verifiers can use the
|
||
signing information to decide how they want to process the message.
|
||
The signing identity is included as part of the signature header
|
||
field.
|
||
|
||
INFORMATIVE RATIONALE: The signing identity specified by a DKIM
|
||
signature is not required to match an address in any particular
|
||
header field because of the broad methods of interpretation by
|
||
recipient mail systems, including MUAs.
|
||
|
||
1.3. Scalability
|
||
|
||
DKIM is designed to support the extreme scalability requirements that
|
||
characterize the email identification problem. There are many
|
||
millions of domains and a much larger number of individual addresses.
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 5]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
DKIM seeks to preserve the positive aspects of the current email
|
||
infrastructure, such as the ability for anyone to communicate with
|
||
anyone else without introduction.
|
||
|
||
1.4. Simple Key Management
|
||
|
||
DKIM differs from traditional hierarchical public-key systems in that
|
||
no certificate authority infrastructure is required; the Verifier
|
||
requests the public key from a repository in the domain of the
|
||
claimed Signer directly rather than from a third party.
|
||
|
||
The DNS is proposed as the initial mechanism for the public keys.
|
||
Thus, DKIM currently depends on DNS administration and the security
|
||
of the DNS system. DKIM is designed to be extensible to other key
|
||
fetching services as they become available.
|
||
|
||
1.5. Data Integrity
|
||
|
||
A DKIM signature associates the "d=" name with the computed hash of
|
||
some or all of the message (see Section 3.7) in order to prevent the
|
||
reuse of the signature with different messages. Verifying the
|
||
signature asserts that the hashed content has not changed since it
|
||
was signed and asserts nothing else about "protecting" the end-to-end
|
||
integrity of the message.
|
||
|
||
2. Terminology and Definitions
|
||
|
||
This section defines terms used in the rest of the document.
|
||
|
||
DKIM is designed to operate within the Internet Mail service, as
|
||
defined in [RFC5598]. Basic email terminology is taken from that
|
||
specification.
|
||
|
||
Syntax descriptions use Augmented BNF (ABNF) [RFC5234].
|
||
|
||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
|
||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
|
||
"OPTIONAL" in this document are to be interpreted as described in
|
||
[RFC2119]. These words take their normative meanings only when they
|
||
are presented in ALL UPPERCASE.
|
||
|
||
2.1. Signers
|
||
|
||
Elements in the mail system that sign messages on behalf of a domain
|
||
are referred to as Signers. These may be MUAs (Mail User Agents),
|
||
MSAs (Mail Submission Agents), MTAs (Mail Transfer Agents), or other
|
||
agents such as mailing list exploders. In general, any Signer will
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 6]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
be involved in the injection of a message into the message system in
|
||
some way. The key issue is that a message must be signed before it
|
||
leaves the administrative domain of the Signer.
|
||
|
||
2.2. Verifiers
|
||
|
||
Elements in the mail system that verify signatures are referred to as
|
||
Verifiers. These may be MTAs, Mail Delivery Agents (MDAs), or MUAs.
|
||
In most cases, it is expected that Verifiers will be close to an end
|
||
user (reader) of the message or some consuming agent such as a
|
||
mailing list exploder.
|
||
|
||
2.3. Identity
|
||
|
||
A person, role, or organization. In the context of DKIM, examples
|
||
include the author, the author's organization, an ISP along the
|
||
handling path, an independent trust assessment service, and a mailing
|
||
list operator.
|
||
|
||
2.4. Identifier
|
||
|
||
A label that refers to an identity.
|
||
|
||
2.5. Signing Domain Identifier (SDID)
|
||
|
||
A single domain name that is the mandatory payload output of DKIM and
|
||
that refers to the identity claiming some responsibility for the
|
||
message by signing it. It is specified in Section 3.5.
|
||
|
||
2.6. Agent or User Identifier (AUID)
|
||
|
||
A single identifier that refers to the agent or user on behalf of
|
||
whom the Signing Domain Identifier (SDID) has taken responsibility.
|
||
The AUID comprises a domain name and an optional <local-part>. The
|
||
domain name is the same as that used for the SDID or is a subdomain
|
||
of it. For DKIM processing, the domain name portion of the AUID has
|
||
only basic domain name semantics; any possible owner-specific
|
||
semantics are outside the scope of DKIM. It is specified in
|
||
Section 3.5.
|
||
|
||
Note that acceptable values for the AUID may be constrained via a
|
||
flag in the public-key record. (See Section 3.6.1.)
|
||
|
||
2.7. Identity Assessor
|
||
|
||
An element in the mail system that consumes DKIM's payload, which is
|
||
the responsible Signing Domain Identifier (SDID). The Identity
|
||
Assessor is dedicated to the assessment of the delivered identifier.
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 7]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Other DKIM (and non-DKIM) values can also be used by the Identity
|
||
Assessor (if they are available) to provide a more general message
|
||
evaluation filtering engine. However, this additional activity is
|
||
outside the scope of this specification.
|
||
|
||
2.8. Whitespace
|
||
|
||
There are three forms of whitespace:
|
||
|
||
o WSP represents simple whitespace, i.e., a space or a tab character
|
||
(formal definition in [RFC5234]).
|
||
|
||
o LWSP is linear whitespace, defined as WSP plus CRLF (formal
|
||
definition in [RFC5234]).
|
||
|
||
o FWS is folding whitespace. It allows multiple lines separated by
|
||
CRLF followed by at least one whitespace, to be joined.
|
||
|
||
The formal ABNF for these are (WSP and LWSP are given for information
|
||
only):
|
||
|
||
WSP = SP / HTAB
|
||
LWSP = *(WSP / CRLF WSP)
|
||
FWS = [*WSP CRLF] 1*WSP
|
||
|
||
The definition of FWS is identical to that in [RFC5322] except for
|
||
the exclusion of obs-FWS.
|
||
|
||
2.9. Imported ABNF Tokens
|
||
|
||
The following tokens are imported from other RFCs as noted. Those
|
||
RFCs should be considered definitive.
|
||
|
||
The following tokens are imported from [RFC5321]:
|
||
|
||
o "local-part" (implementation warning: this permits quoted strings)
|
||
|
||
o "sub-domain"
|
||
|
||
The following tokens are imported from [RFC5322]:
|
||
|
||
o "field-name" (name of a header field)
|
||
|
||
o "dot-atom-text" (in the local-part of an email address)
|
||
|
||
The following tokens are imported from [RFC2045]:
|
||
|
||
o "qp-section" (a single line of quoted-printable-encoded text)
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 8]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
o "hex-octet" (a quoted-printable encoded octet)
|
||
|
||
INFORMATIVE NOTE: Be aware that the ABNF in [RFC2045] does not
|
||
obey the rules of [RFC5234] and must be interpreted accordingly,
|
||
particularly as regards case folding.
|
||
|
||
Other tokens not defined herein are imported from [RFC5234]. These
|
||
are intuitive primitives such as SP, HTAB, WSP, ALPHA, DIGIT, CRLF,
|
||
etc.
|
||
|
||
2.10. Common ABNF Tokens
|
||
|
||
The following ABNF tokens are used elsewhere in this document:
|
||
|
||
hyphenated-word = ALPHA [ *(ALPHA / DIGIT / "-") (ALPHA / DIGIT) ]
|
||
ALPHADIGITPS = (ALPHA / DIGIT / "+" / "/")
|
||
base64string = ALPHADIGITPS *([FWS] ALPHADIGITPS)
|
||
[ [FWS] "=" [ [FWS] "=" ] ]
|
||
hdr-name = field-name
|
||
qp-hdr-value = dkim-quoted-printable ; with "|" encoded
|
||
|
||
2.11. DKIM-Quoted-Printable
|
||
|
||
The DKIM-Quoted-Printable encoding syntax resembles that described in
|
||
Quoted-Printable [RFC2045], Section 6.7: any character MAY be encoded
|
||
as an "=" followed by two hexadecimal digits from the alphabet
|
||
"0123456789ABCDEF" (no lowercase characters permitted) representing
|
||
the hexadecimal-encoded integer value of that character. All control
|
||
characters (those with values < %x20), 8-bit characters (values >
|
||
%x7F), and the characters DEL (%x7F), SPACE (%x20), and semicolon
|
||
(";", %x3B) MUST be encoded. Note that all whitespace, including
|
||
SPACE, CR, and LF characters, MUST be encoded. After encoding, FWS
|
||
MAY be added at arbitrary locations in order to avoid excessively
|
||
long lines; such whitespace is NOT part of the value, and MUST be
|
||
removed before decoding. Use of characters not listed as "mail-safe"
|
||
in [RFC2049] is NOT RECOMMENDED.
|
||
|
||
ABNF:
|
||
|
||
dkim-quoted-printable = *(FWS / hex-octet / dkim-safe-char)
|
||
; hex-octet is from RFC2045
|
||
dkim-safe-char = %x21-3A / %x3C / %x3E-7E
|
||
; '!' - ':', '<', '>' - '~'
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 9]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
INFORMATIVE NOTE: DKIM-Quoted-Printable differs from Quoted-
|
||
Printable as defined in [RFC2045] in several important ways:
|
||
|
||
1. Whitespace in the input text, including CR and LF, must be
|
||
encoded. [RFC2045] does not require such encoding, and does
|
||
not permit encoding of CR or LF characters that are part of a
|
||
CRLF line break.
|
||
|
||
2. Whitespace in the encoded text is ignored. This is to allow
|
||
tags encoded using DKIM-Quoted-Printable to be wrapped as
|
||
needed. In particular, [RFC2045] requires that line breaks in
|
||
the input be represented as physical line breaks; that is not
|
||
the case here.
|
||
|
||
3. The "soft line break" syntax ("=" as the last non-whitespace
|
||
character on the line) does not apply.
|
||
|
||
4. DKIM-Quoted-Printable does not require that encoded lines be
|
||
no more than 76 characters long (although there may be other
|
||
requirements depending on the context in which the encoded
|
||
text is being used).
|
||
|
||
3. Protocol Elements
|
||
|
||
Protocol Elements are conceptual parts of the protocol that are not
|
||
specific to either Signers or Verifiers. The protocol descriptions
|
||
for Signers and Verifiers are described in later sections ("Signer
|
||
Actions" (Section 5) and "Verifier Actions" (Section 6)). NOTE: This
|
||
section must be read in the context of those sections.
|
||
|
||
3.1. Selectors
|
||
|
||
To support multiple concurrent public keys per signing domain, the
|
||
key namespace is subdivided using "selectors". For example,
|
||
selectors might indicate the names of office locations (e.g.,
|
||
"sanfrancisco", "coolumbeach", and "reykjavik"), the signing date
|
||
(e.g., "january2005", "february2005", etc.), or even an individual
|
||
user.
|
||
|
||
Selectors are needed to support some important use cases. For
|
||
example:
|
||
|
||
o Domains that want to delegate signing capability for a specific
|
||
address for a given duration to a partner, such as an advertising
|
||
provider or other outsourced function.
|
||
|
||
o Domains that want to allow frequent travelers to send messages
|
||
locally without the need to connect with a particular MSA.
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 10]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
o "Affinity" domains (e.g., college alumni associations) that
|
||
provide forwarding of incoming mail, but that do not operate a
|
||
mail submission agent for outgoing mail.
|
||
|
||
Periods are allowed in selectors and are component separators. When
|
||
keys are retrieved from the DNS, periods in selectors define DNS
|
||
label boundaries in a manner similar to the conventional use in
|
||
domain names. Selector components might be used to combine dates
|
||
with locations, for example, "march2005.reykjavik". In a DNS
|
||
implementation, this can be used to allow delegation of a portion of
|
||
the selector namespace.
|
||
|
||
ABNF:
|
||
|
||
selector = sub-domain *( "." sub-domain )
|
||
|
||
The number of public keys and corresponding selectors for each domain
|
||
is determined by the domain owner. Many domain owners will be
|
||
satisfied with just one selector, whereas administratively
|
||
distributed organizations can choose to manage disparate selectors
|
||
and key pairs in different regions or on different email servers.
|
||
|
||
Beyond administrative convenience, selectors make it possible to
|
||
seamlessly replace public keys on a routine basis. If a domain
|
||
wishes to change from using a public key associated with selector
|
||
"january2005" to a public key associated with selector
|
||
"february2005", it merely makes sure that both public keys are
|
||
advertised in the public-key repository concurrently for the
|
||
transition period during which email may be in transit prior to
|
||
verification. At the start of the transition period, the outbound
|
||
email servers are configured to sign with the "february2005" private
|
||
key. At the end of the transition period, the "january2005" public
|
||
key is removed from the public-key repository.
|
||
|
||
INFORMATIVE NOTE: A key may also be revoked as described below.
|
||
The distinction between revoking and removing a key selector
|
||
record is subtle. When phasing out keys as described above, a
|
||
signing domain would probably simply remove the key record after
|
||
the transition period. However, a signing domain could elect to
|
||
revoke the key (but maintain the key record) for a further period.
|
||
There is no defined semantic difference between a revoked key and
|
||
a removed key.
|
||
|
||
While some domains may wish to make selector values well-known,
|
||
others will want to take care not to allocate selector names in a way
|
||
that allows harvesting of data by outside parties. For example, if
|
||
per-user keys are issued, the domain owner will need to decide
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 11]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
whether to associate this selector directly with the name of a
|
||
registered end user or make it some unassociated random value, such
|
||
as a fingerprint of the public key.
|
||
|
||
INFORMATIVE OPERATIONS NOTE: Reusing a selector with a new key
|
||
(for example, changing the key associated with a user's name)
|
||
makes it impossible to tell the difference between a message that
|
||
didn't verify because the key is no longer valid and a message
|
||
that is actually forged. For this reason, Signers are ill-advised
|
||
to reuse selectors for new keys. A better strategy is to assign
|
||
new keys to new selectors.
|
||
|
||
3.2. Tag=Value Lists
|
||
|
||
DKIM uses a simple "tag=value" syntax in several contexts, including
|
||
in messages and domain signature records.
|
||
|
||
Values are a series of strings containing either plain text, "base64"
|
||
text (as defined in [RFC2045], Section 6.8), "qp-section" (ibid,
|
||
Section 6.7), or "dkim-quoted-printable" (as defined in
|
||
Section 2.11). The name of the tag will determine the encoding of
|
||
each value. Unencoded semicolon (";") characters MUST NOT occur in
|
||
the tag value, since that separates tag-specs.
|
||
|
||
INFORMATIVE IMPLEMENTATION NOTE: Although the "plain text" defined
|
||
below (as "tag-value") only includes 7-bit characters, an
|
||
implementation that wished to anticipate future standards would be
|
||
advised not to preclude the use of UTF-8-encoded ([RFC3629]) text
|
||
in tag=value lists.
|
||
|
||
Formally, the ABNF syntax rules are as follows:
|
||
|
||
tag-list = tag-spec *( ";" tag-spec ) [ ";" ]
|
||
tag-spec = [FWS] tag-name [FWS] "=" [FWS] tag-value [FWS]
|
||
tag-name = ALPHA *ALNUMPUNC
|
||
tag-value = [ tval *( 1*(WSP / FWS) tval ) ]
|
||
; Prohibits WSP and FWS at beginning and end
|
||
tval = 1*VALCHAR
|
||
VALCHAR = %x21-3A / %x3C-7E
|
||
; EXCLAMATION to TILDE except SEMICOLON
|
||
ALNUMPUNC = ALPHA / DIGIT / "_"
|
||
|
||
Note that WSP is allowed anywhere around tags. In particular, any
|
||
WSP after the "=" and any WSP before the terminating ";" is not part
|
||
of the value; however, WSP inside the value is significant.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 12]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Tags MUST be interpreted in a case-sensitive manner. Values MUST be
|
||
processed as case sensitive unless the specific tag description of
|
||
semantics specifies case insensitivity.
|
||
|
||
Tags with duplicate names MUST NOT occur within a single tag-list; if
|
||
a tag name does occur more than once, the entire tag-list is invalid.
|
||
|
||
Whitespace within a value MUST be retained unless explicitly excluded
|
||
by the specific tag description.
|
||
|
||
Tag=value pairs that represent the default value MAY be included to
|
||
aid legibility.
|
||
|
||
Unrecognized tags MUST be ignored.
|
||
|
||
Tags that have an empty value are not the same as omitted tags. An
|
||
omitted tag is treated as having the default value; a tag with an
|
||
empty value explicitly designates the empty string as the value.
|
||
|
||
3.3. Signing and Verification Algorithms
|
||
|
||
DKIM supports multiple digital signature algorithms. Two algorithms
|
||
are defined by this specification at this time: rsa-sha1 and rsa-
|
||
sha256. Signers MUST implement and SHOULD sign using rsa-sha256.
|
||
Verifiers MUST implement both rsa-sha1 and rsa-sha256.
|
||
|
||
INFORMATIVE NOTE: Although rsa-sha256 is strongly encouraged, some
|
||
senders might prefer to use rsa-sha1 when balancing security
|
||
strength against performance, complexity, or other needs. In
|
||
general, however, rsa-sha256 should always be used whenever
|
||
possible.
|
||
|
||
3.3.1. The rsa-sha1 Signing Algorithm
|
||
|
||
The rsa-sha1 Signing Algorithm computes a message hash as described
|
||
in Section 3.7 using SHA-1 [FIPS-180-3-2008] as the hash-alg. That
|
||
hash is then signed by the Signer using the RSA algorithm (defined in
|
||
Public-Key Cryptography Standards (PKCS) #1 version 1.5 [RFC3447]) as
|
||
the crypt-alg and the Signer's private key. The hash MUST NOT be
|
||
truncated or converted into any form other than the native binary
|
||
form before being signed. The signing algorithm SHOULD use a public
|
||
exponent of 65537.
|
||
|
||
3.3.2. The rsa-sha256 Signing Algorithm
|
||
|
||
The rsa-sha256 Signing Algorithm computes a message hash as described
|
||
in Section 3.7 using SHA-256 [FIPS-180-3-2008] as the hash-alg. That
|
||
hash is then signed by the Signer using the RSA algorithm (defined in
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 13]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
PKCS#1 version 1.5 [RFC3447]) as the crypt-alg and the Signer's
|
||
private key. The hash MUST NOT be truncated or converted into any
|
||
form other than the native binary form before being signed. The
|
||
signing algorithm SHOULD use a public exponent of 65537.
|
||
|
||
3.3.3. Key Sizes
|
||
|
||
Selecting appropriate key sizes is a trade-off between cost,
|
||
performance, and risk. Since short RSA keys more easily succumb to
|
||
off-line attacks, Signers MUST use RSA keys of at least 1024 bits for
|
||
long-lived keys. Verifiers MUST be able to validate signatures with
|
||
keys ranging from 512 bits to 2048 bits, and they MAY be able to
|
||
validate signatures with larger keys. Verifier policies may use the
|
||
length of the signing key as one metric for determining whether a
|
||
signature is acceptable.
|
||
|
||
Factors that should influence the key size choice include the
|
||
following:
|
||
|
||
o The practical constraint that large (e.g., 4096-bit) keys might
|
||
not fit within a 512-byte DNS UDP response packet
|
||
|
||
o The security constraint that keys smaller than 1024 bits are
|
||
subject to off-line attacks
|
||
|
||
o Larger keys impose higher CPU costs to verify and sign email
|
||
|
||
o Keys can be replaced on a regular basis; thus, their lifetime can
|
||
be relatively short
|
||
|
||
o The security goals of this specification are modest compared to
|
||
typical goals of other systems that employ digital signatures
|
||
|
||
See [RFC3766] for further discussion on selecting key sizes.
|
||
|
||
3.3.4. Other Algorithms
|
||
|
||
Other algorithms MAY be defined in the future. Verifiers MUST ignore
|
||
any signatures using algorithms that they do not implement.
|
||
|
||
3.4. Canonicalization
|
||
|
||
Some mail systems modify email in transit, potentially invalidating a
|
||
signature. For most Signers, mild modification of email is
|
||
immaterial to validation of the DKIM domain name's use. For such
|
||
Signers, a canonicalization algorithm that survives modest in-transit
|
||
modification is preferred.
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 14]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Other Signers demand that any modification of the email, however
|
||
minor, result in a signature verification failure. These Signers
|
||
prefer a canonicalization algorithm that does not tolerate in-transit
|
||
modification of the signed email.
|
||
|
||
Some Signers may be willing to accept modifications to header fields
|
||
that are within the bounds of email standards such as [RFC5322], but
|
||
are unwilling to accept any modification to the body of messages.
|
||
|
||
To satisfy all requirements, two canonicalization algorithms are
|
||
defined for each of the header and the body: a "simple" algorithm
|
||
that tolerates almost no modification and a "relaxed" algorithm that
|
||
tolerates common modifications such as whitespace replacement and
|
||
header field line rewrapping. A Signer MAY specify either algorithm
|
||
for header or body when signing an email. If no canonicalization
|
||
algorithm is specified by the Signer, the "simple" algorithm defaults
|
||
for both header and body. Verifiers MUST implement both
|
||
canonicalization algorithms. Note that the header and body may use
|
||
different canonicalization algorithms. Further canonicalization
|
||
algorithms MAY be defined in the future; Verifiers MUST ignore any
|
||
signatures that use unrecognized canonicalization algorithms.
|
||
|
||
Canonicalization simply prepares the email for presentation to the
|
||
signing or verification algorithm. It MUST NOT change the
|
||
transmitted data in any way. Canonicalization of header fields and
|
||
body are described below.
|
||
|
||
NOTE: This section assumes that the message is already in "network
|
||
normal" format (text is ASCII encoded, lines are separated with CRLF
|
||
characters, etc.). See also Section 5.3 for information about
|
||
normalizing the message.
|
||
|
||
3.4.1. The "simple" Header Canonicalization Algorithm
|
||
|
||
The "simple" header canonicalization algorithm does not change header
|
||
fields in any way. Header fields MUST be presented to the signing or
|
||
verification algorithm exactly as they are in the message being
|
||
signed or verified. In particular, header field names MUST NOT be
|
||
case folded and whitespace MUST NOT be changed.
|
||
|
||
3.4.2. The "relaxed" Header Canonicalization Algorithm
|
||
|
||
The "relaxed" header canonicalization algorithm MUST apply the
|
||
following steps in order:
|
||
|
||
o Convert all header field names (not the header field values) to
|
||
lowercase. For example, convert "SUBJect: AbC" to "subject: AbC".
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 15]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
o Unfold all header field continuation lines as described in
|
||
[RFC5322]; in particular, lines with terminators embedded in
|
||
continued header field values (that is, CRLF sequences followed by
|
||
WSP) MUST be interpreted without the CRLF. Implementations MUST
|
||
NOT remove the CRLF at the end of the header field value.
|
||
|
||
o Convert all sequences of one or more WSP characters to a single SP
|
||
character. WSP characters here include those before and after a
|
||
line folding boundary.
|
||
|
||
o Delete all WSP characters at the end of each unfolded header field
|
||
value.
|
||
|
||
o Delete any WSP characters remaining before and after the colon
|
||
separating the header field name from the header field value. The
|
||
colon separator MUST be retained.
|
||
|
||
3.4.3. The "simple" Body Canonicalization Algorithm
|
||
|
||
The "simple" body canonicalization algorithm ignores all empty lines
|
||
at the end of the message body. An empty line is a line of zero
|
||
length after removal of the line terminator. If there is no body or
|
||
no trailing CRLF on the message body, a CRLF is added. It makes no
|
||
other changes to the message body. In more formal terms, the
|
||
"simple" body canonicalization algorithm converts "*CRLF" at the end
|
||
of the body to a single "CRLF".
|
||
|
||
Note that a completely empty or missing body is canonicalized as a
|
||
single "CRLF"; that is, the canonicalized length will be 2 octets.
|
||
|
||
The SHA-1 value (in base64) for an empty body (canonicalized to a
|
||
"CRLF") is:
|
||
|
||
uoq1oCgLlTqpdDX/iUbLy7J1Wic=
|
||
|
||
The SHA-256 value is:
|
||
|
||
frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=
|
||
|
||
3.4.4. The "relaxed" Body Canonicalization Algorithm
|
||
|
||
The "relaxed" body canonicalization algorithm MUST apply the
|
||
following steps (a) and (b) in order:
|
||
|
||
a. Reduce whitespace:
|
||
|
||
* Ignore all whitespace at the end of lines. Implementations
|
||
MUST NOT remove the CRLF at the end of the line.
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 16]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
* Reduce all sequences of WSP within a line to a single SP
|
||
character.
|
||
|
||
b. Ignore all empty lines at the end of the message body. "Empty
|
||
line" is defined in Section 3.4.3. If the body is non-empty but
|
||
does not end with a CRLF, a CRLF is added. (For email, this is
|
||
only possible when using extensions to SMTP or non-SMTP transport
|
||
mechanisms.)
|
||
|
||
The SHA-1 value (in base64) for an empty body (canonicalized to a
|
||
null input) is:
|
||
|
||
2jmj7l5rSw0yVb/vlWAYkK/YBwk=
|
||
|
||
The SHA-256 value is:
|
||
|
||
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
|
||
|
||
3.4.5. Canonicalization Examples (INFORMATIVE)
|
||
|
||
In the following examples, actual whitespace is used only for
|
||
clarity. The actual input and output text is designated using
|
||
bracketed descriptors: "<SP>" for a space character, "<HTAB>" for a
|
||
tab character, and "<CRLF>" for a carriage-return/line-feed sequence.
|
||
For example, "X <SP> Y" and "X<SP>Y" represent the same three
|
||
characters.
|
||
|
||
Example 1: A message reading:
|
||
|
||
A: <SP> X <CRLF>
|
||
B <SP> : <SP> Y <HTAB><CRLF>
|
||
<HTAB> Z <SP><SP><CRLF>
|
||
<CRLF>
|
||
<SP> C <SP><CRLF>
|
||
D <SP><HTAB><SP> E <CRLF>
|
||
<CRLF>
|
||
<CRLF>
|
||
|
||
when canonicalized using relaxed canonicalization for both header and
|
||
body results in a header reading:
|
||
|
||
a:X <CRLF>
|
||
b:Y <SP> Z <CRLF>
|
||
|
||
and a body reading:
|
||
|
||
<SP> C <CRLF>
|
||
D <SP> E <CRLF>
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 17]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Example 2: The same message canonicalized using simple
|
||
canonicalization for both header and body results in a header
|
||
reading:
|
||
|
||
A: <SP> X <CRLF>
|
||
B <SP> : <SP> Y <HTAB><CRLF>
|
||
<HTAB> Z <SP><SP><CRLF>
|
||
|
||
and a body reading:
|
||
|
||
<SP> C <SP><CRLF>
|
||
D <SP><HTAB><SP> E <CRLF>
|
||
|
||
Example 3: When processed using relaxed header canonicalization and
|
||
simple body canonicalization, the canonicalized version has a header
|
||
of:
|
||
|
||
a:X <CRLF>
|
||
b:Y <SP> Z <CRLF>
|
||
|
||
and a body reading:
|
||
|
||
<SP> C <SP><CRLF>
|
||
D <SP><HTAB><SP> E <CRLF>
|
||
|
||
3.5. The DKIM-Signature Header Field
|
||
|
||
The signature of the email is stored in the DKIM-Signature header
|
||
field. This header field contains all of the signature and key-
|
||
fetching data. The DKIM-Signature value is a tag-list as described
|
||
in Section 3.2.
|
||
|
||
The DKIM-Signature header field SHOULD be treated as though it were a
|
||
trace header field as defined in Section 3.6 of [RFC5322] and hence
|
||
SHOULD NOT be reordered and SHOULD be prepended to the message.
|
||
|
||
The DKIM-Signature header field being created or verified is always
|
||
included in the signature calculation, after the rest of the header
|
||
fields being signed; however, when calculating or verifying the
|
||
signature, the value of the "b=" tag (signature value) of that DKIM-
|
||
Signature header field MUST be treated as though it were an empty
|
||
string. Unknown tags in the DKIM-Signature header field MUST be
|
||
included in the signature calculation but MUST be otherwise ignored
|
||
by Verifiers. Other DKIM-Signature header fields that are included
|
||
in the signature should be treated as normal header fields; in
|
||
particular, the "b=" tag is not treated specially.
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 18]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
The encodings for each field type are listed below. Tags described
|
||
as qp-section are encoded as described in Section 6.7 of MIME Part
|
||
One [RFC2045], with the additional conversion of semicolon characters
|
||
to "=3B"; intuitively, this is one line of quoted-printable encoded
|
||
text. The dkim-quoted-printable syntax is defined in Section 2.11.
|
||
|
||
Tags on the DKIM-Signature header field along with their type and
|
||
requirement status are shown below. Unrecognized tags MUST be
|
||
ignored.
|
||
|
||
v= Version (plain-text; REQUIRED). This tag defines the version of
|
||
this specification that applies to the signature record. It MUST
|
||
have the value "1" for implementations compliant with this version
|
||
of DKIM.
|
||
|
||
ABNF:
|
||
|
||
sig-v-tag = %x76 [FWS] "=" [FWS] 1*DIGIT
|
||
|
||
INFORMATIVE NOTE: DKIM-Signature version numbers may increase
|
||
arithmetically as new versions of this specification are
|
||
released.
|
||
|
||
a= The algorithm used to generate the signature (plain-text;
|
||
REQUIRED). Verifiers MUST support "rsa-sha1" and "rsa-sha256";
|
||
Signers SHOULD sign using "rsa-sha256". See Section 3.3 for a
|
||
description of the algorithms.
|
||
|
||
ABNF:
|
||
|
||
sig-a-tag = %x61 [FWS] "=" [FWS] sig-a-tag-alg
|
||
sig-a-tag-alg = sig-a-tag-k "-" sig-a-tag-h
|
||
sig-a-tag-k = "rsa" / x-sig-a-tag-k
|
||
sig-a-tag-h = "sha1" / "sha256" / x-sig-a-tag-h
|
||
x-sig-a-tag-k = ALPHA *(ALPHA / DIGIT)
|
||
; for later extension
|
||
x-sig-a-tag-h = ALPHA *(ALPHA / DIGIT)
|
||
; for later extension
|
||
|
||
b= The signature data (base64; REQUIRED). Whitespace is ignored in
|
||
this value and MUST be ignored when reassembling the original
|
||
signature. In particular, the signing process can safely insert
|
||
FWS in this value in arbitrary places to conform to line-length
|
||
limits. See "Signer Actions" (Section 5) for how the signature is
|
||
computed.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 19]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
ABNF:
|
||
|
||
sig-b-tag = %x62 [FWS] "=" [FWS] sig-b-tag-data
|
||
sig-b-tag-data = base64string
|
||
|
||
bh= The hash of the canonicalized body part of the message as
|
||
limited by the "l=" tag (base64; REQUIRED). Whitespace is ignored
|
||
in this value and MUST be ignored when reassembling the original
|
||
signature. In particular, the signing process can safely insert
|
||
FWS in this value in arbitrary places to conform to line-length
|
||
limits. See Section 3.7 for how the body hash is computed.
|
||
|
||
ABNF:
|
||
|
||
sig-bh-tag = %x62 %x68 [FWS] "=" [FWS] sig-bh-tag-data
|
||
sig-bh-tag-data = base64string
|
||
|
||
c= Message canonicalization (plain-text; OPTIONAL, default is
|
||
"simple/simple"). This tag informs the Verifier of the type of
|
||
canonicalization used to prepare the message for signing. It
|
||
consists of two names separated by a "slash" (%d47) character,
|
||
corresponding to the header and body canonicalization algorithms,
|
||
respectively. These algorithms are described in Section 3.4. If
|
||
only one algorithm is named, that algorithm is used for the header
|
||
and "simple" is used for the body. For example, "c=relaxed" is
|
||
treated the same as "c=relaxed/simple".
|
||
|
||
ABNF:
|
||
|
||
sig-c-tag = %x63 [FWS] "=" [FWS] sig-c-tag-alg
|
||
["/" sig-c-tag-alg]
|
||
sig-c-tag-alg = "simple" / "relaxed" / x-sig-c-tag-alg
|
||
x-sig-c-tag-alg = hyphenated-word ; for later extension
|
||
|
||
d= The SDID claiming responsibility for an introduction of a message
|
||
into the mail stream (plain-text; REQUIRED). Hence, the SDID
|
||
value is used to form the query for the public key. The SDID MUST
|
||
correspond to a valid DNS name under which the DKIM key record is
|
||
published. The conventions and semantics used by a Signer to
|
||
create and use a specific SDID are outside the scope of this
|
||
specification, as is any use of those conventions and semantics.
|
||
When presented with a signature that does not meet these
|
||
requirements, Verifiers MUST consider the signature invalid.
|
||
|
||
Internationalized domain names MUST be encoded as A-labels, as
|
||
described in Section 2.3 of [RFC5890].
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 20]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
ABNF:
|
||
|
||
sig-d-tag = %x64 [FWS] "=" [FWS] domain-name
|
||
domain-name = sub-domain 1*("." sub-domain)
|
||
; from [RFC5321] Domain,
|
||
; excluding address-literal
|
||
|
||
h= Signed header fields (plain-text, but see description; REQUIRED).
|
||
A colon-separated list of header field names that identify the
|
||
header fields presented to the signing algorithm. The field MUST
|
||
contain the complete list of header fields in the order presented
|
||
to the signing algorithm. The field MAY contain names of header
|
||
fields that do not exist when signed; nonexistent header fields do
|
||
not contribute to the signature computation (that is, they are
|
||
treated as the null input, including the header field name, the
|
||
separating colon, the header field value, and any CRLF
|
||
terminator). The field MAY contain multiple instances of a header
|
||
field name, meaning multiple occurrences of the corresponding
|
||
header field are included in the header hash. The field MUST NOT
|
||
include the DKIM-Signature header field that is being created or
|
||
verified but may include others. Folding whitespace (FWS) MAY be
|
||
included on either side of the colon separator. Header field
|
||
names MUST be compared against actual header field names in a
|
||
case-insensitive manner. This list MUST NOT be empty. See
|
||
Section 5.4 for a discussion of choosing header fields to sign and
|
||
Section 5.4.2 for requirements when signing multiple instances of
|
||
a single field.
|
||
|
||
ABNF:
|
||
|
||
sig-h-tag = %x68 [FWS] "=" [FWS] hdr-name
|
||
*( [FWS] ":" [FWS] hdr-name )
|
||
|
||
INFORMATIVE EXPLANATION: By "signing" header fields that do not
|
||
actually exist, a Signer can allow a Verifier to detect
|
||
insertion of those header fields after signing. However, since
|
||
a Signer cannot possibly know what header fields might be
|
||
defined in the future, this mechanism cannot be used to prevent
|
||
the addition of any possible unknown header fields.
|
||
|
||
INFORMATIVE NOTE: "Signing" fields that are not present at the
|
||
time of signing not only prevents fields and values from being
|
||
added but also prevents adding fields with no values.
|
||
|
||
i= The Agent or User Identifier (AUID) on behalf of which the SDID is
|
||
taking responsibility (dkim-quoted-printable; OPTIONAL, default is
|
||
an empty local-part followed by an "@" followed by the domain from
|
||
the "d=" tag).
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 21]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
The syntax is a standard email address where the local-part MAY be
|
||
omitted. The domain part of the address MUST be the same as, or a
|
||
subdomain of, the value of the "d=" tag.
|
||
|
||
Internationalized domain names MUST be encoded as A-labels, as
|
||
described in Section 2.3 of [RFC5890].
|
||
|
||
ABNF:
|
||
|
||
sig-i-tag = %x69 [FWS] "=" [FWS] [ Local-part ]
|
||
"@" domain-name
|
||
|
||
The AUID is specified as having the same syntax as an email
|
||
address but it need not have the same semantics. Notably, the
|
||
domain name need not be registered in the DNS -- so it might not
|
||
resolve in a query -- and the local-part MAY be drawn from a
|
||
namespace unrelated to any mailbox. The details of the structure
|
||
and semantics for the namespace are determined by the Signer. Any
|
||
knowledge or use of those details by Verifiers or Assessors is
|
||
outside the scope of this specification. The Signer MAY choose to
|
||
use the same namespace for its AUIDs as its users' email addresses
|
||
or MAY choose other means of representing its users. However, the
|
||
Signer SHOULD use the same AUID for each message intended to be
|
||
evaluated as being within the same sphere of responsibility, if it
|
||
wishes to offer receivers the option of using the AUID as a stable
|
||
identifier that is finer grained than the SDID.
|
||
|
||
INFORMATIVE NOTE: The local-part of the "i=" tag is optional
|
||
because in some cases a Signer may not be able to establish a
|
||
verified individual identity. In such cases, the Signer might
|
||
wish to assert that although it is willing to go as far as
|
||
signing for the domain, it is unable or unwilling to commit to
|
||
an individual user name within the domain. It can do so by
|
||
including the domain part but not the local-part of the
|
||
identity.
|
||
|
||
INFORMATIVE DISCUSSION: This specification does not require the
|
||
value of the "i=" tag to match the identity in any message
|
||
header fields. This is considered to be a Verifier policy
|
||
issue. Constraints between the value of the "i=" tag and other
|
||
identities in other header fields seek to apply basic
|
||
authentication into the semantics of trust associated with a
|
||
role such as content author. Trust is a broad and complex
|
||
topic, and trust mechanisms are subject to highly creative
|
||
attacks. The real-world efficacy of any but the most basic
|
||
bindings between the "i=" value and other identities is not
|
||
well established, nor is its vulnerability to subversion by an
|
||
attacker. Hence, reliance on the use of these options should
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 22]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
be strictly limited. In particular, it is not at all clear to
|
||
what extent a typical end-user recipient can rely on any
|
||
assurances that might be made by successful use of the "i="
|
||
options.
|
||
|
||
l= Body length count (plain-text unsigned decimal integer; OPTIONAL,
|
||
default is entire body). This tag informs the Verifier of the
|
||
number of octets in the body of the email after canonicalization
|
||
included in the cryptographic hash, starting from 0 immediately
|
||
following the CRLF preceding the body. This value MUST NOT be
|
||
larger than the actual number of octets in the canonicalized
|
||
message body. See further discussion in Section 8.2.
|
||
|
||
INFORMATIVE NOTE: The value of the "l=" tag is constrained to
|
||
76 decimal digits. This constraint is not intended to predict
|
||
the size of future messages or to require implementations to
|
||
use an integer representation large enough to represent the
|
||
maximum possible value but is intended to remind the
|
||
implementer to check the length of this and all other tags
|
||
during verification and to test for integer overflow when
|
||
decoding the value. Implementers may need to limit the actual
|
||
value expressed to a value smaller than 10^76, e.g., to allow a
|
||
message to fit within the available storage space.
|
||
|
||
ABNF:
|
||
|
||
sig-l-tag = %x6c [FWS] "=" [FWS]
|
||
1*76DIGIT
|
||
|
||
q= A colon-separated list of query methods used to retrieve the
|
||
public key (plain-text; OPTIONAL, default is "dns/txt"). Each
|
||
query method is of the form "type[/options]", where the syntax and
|
||
semantics of the options depend on the type and specified options.
|
||
If there are multiple query mechanisms listed, the choice of query
|
||
mechanism MUST NOT change the interpretation of the signature.
|
||
Implementations MUST use the recognized query mechanisms in the
|
||
order presented. Unrecognized query mechanisms MUST be ignored.
|
||
|
||
Currently, the only valid value is "dns/txt", which defines the
|
||
DNS TXT resource record (RR) lookup algorithm described elsewhere
|
||
in this document. The only option defined for the "dns" query
|
||
type is "txt", which MUST be included. Verifiers and Signers MUST
|
||
support "dns/txt".
|
||
|
||
ABNF:
|
||
|
||
sig-q-tag = %x71 [FWS] "=" [FWS] sig-q-tag-method
|
||
*([FWS] ":" [FWS] sig-q-tag-method)
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 23]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
sig-q-tag-method = "dns/txt" / x-sig-q-tag-type
|
||
["/" x-sig-q-tag-args]
|
||
x-sig-q-tag-type = hyphenated-word ; for future extension
|
||
x-sig-q-tag-args = qp-hdr-value
|
||
|
||
s= The selector subdividing the namespace for the "d=" (domain) tag
|
||
(plain-text; REQUIRED).
|
||
|
||
Internationalized selector names MUST be encoded as A-labels, as
|
||
described in Section 2.3 of [RFC5890].
|
||
|
||
ABNF:
|
||
|
||
sig-s-tag = %x73 [FWS] "=" [FWS] selector
|
||
|
||
t= Signature Timestamp (plain-text unsigned decimal integer;
|
||
RECOMMENDED, default is an unknown creation time). The time that
|
||
this signature was created. The format is the number of seconds
|
||
since 00:00:00 on January 1, 1970 in the UTC time zone. The value
|
||
is expressed as an unsigned integer in decimal ASCII. This value
|
||
is not constrained to fit into a 31- or 32-bit integer.
|
||
Implementations SHOULD be prepared to handle values up to at least
|
||
10^12 (until approximately AD 200,000; this fits into 40 bits).
|
||
To avoid denial-of-service attacks, implementations MAY consider
|
||
any value longer than 12 digits to be infinite. Leap seconds are
|
||
not counted. Implementations MAY ignore signatures that have a
|
||
timestamp in the future.
|
||
|
||
ABNF:
|
||
|
||
sig-t-tag = %x74 [FWS] "=" [FWS] 1*12DIGIT
|
||
|
||
x= Signature Expiration (plain-text unsigned decimal integer;
|
||
RECOMMENDED, default is no expiration). The format is the same as
|
||
in the "t=" tag, represented as an absolute date, not as a time
|
||
delta from the signing timestamp. The value is expressed as an
|
||
unsigned integer in decimal ASCII, with the same constraints on
|
||
the value in the "t=" tag. Signatures MAY be considered invalid
|
||
if the verification time at the Verifier is past the expiration
|
||
date. The verification time should be the time that the message
|
||
was first received at the administrative domain of the Verifier if
|
||
that time is reliably available; otherwise, the current time
|
||
should be used. The value of the "x=" tag MUST be greater than
|
||
the value of the "t=" tag if both are present.
|
||
|
||
INFORMATIVE NOTE: The "x=" tag is not intended as an anti-
|
||
replay defense.
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 24]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
INFORMATIVE NOTE: Due to clock drift, the receiver's notion of
|
||
when to consider the signature expired may not exactly match
|
||
what the sender is expecting. Receivers MAY add a 'fudge
|
||
factor' to allow for such possible drift.
|
||
|
||
ABNF:
|
||
|
||
sig-x-tag = %x78 [FWS] "=" [FWS]
|
||
1*12DIGIT
|
||
|
||
z= Copied header fields (dkim-quoted-printable, but see description;
|
||
OPTIONAL, default is null). A vertical-bar-separated list of
|
||
selected header fields present when the message was signed,
|
||
including both the field name and value. It is not required to
|
||
include all header fields present at the time of signing. This
|
||
field need not contain the same header fields listed in the "h="
|
||
tag. The header field text itself must encode the vertical bar
|
||
("|", %x7C) character (i.e., vertical bars in the "z=" text are
|
||
meta-characters, and any actual vertical bar characters in a
|
||
copied header field must be encoded). Note that all whitespace
|
||
must be encoded, including whitespace between the colon and the
|
||
header field value. After encoding, FWS MAY be added at arbitrary
|
||
locations in order to avoid excessively long lines; such
|
||
whitespace is NOT part of the value of the header field and MUST
|
||
be removed before decoding.
|
||
|
||
The header fields referenced by the "h=" tag refer to the fields
|
||
in the [RFC5322] header of the message, not to any copied fields
|
||
in the "z=" tag. Copied header field values are for diagnostic
|
||
use.
|
||
|
||
ABNF:
|
||
|
||
sig-z-tag = %x7A [FWS] "=" [FWS] sig-z-tag-copy
|
||
*( "|" [FWS] sig-z-tag-copy )
|
||
sig-z-tag-copy = hdr-name [FWS] ":" qp-hdr-value
|
||
|
||
INFORMATIVE EXAMPLE of a signature header field spread across
|
||
multiple continuation lines:
|
||
|
||
DKIM-Signature: v=1; a=rsa-sha256; d=example.net; s=brisbane;
|
||
c=simple; q=dns/txt; i=@eng.example.net;
|
||
t=1117574938; x=1118006938;
|
||
h=from:to:subject:date;
|
||
z=From:foo@eng.example.net|To:joe@example.com|
|
||
Subject:demo=20run|Date:July=205,=202005=203:44:08=20PM=20-0700;
|
||
bh=MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=;
|
||
b=dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZVoG4ZHRNiYzR
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 25]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
3.6. Key Management and Representation
|
||
|
||
Signature applications require some level of assurance that the
|
||
verification public key is associated with the claimed Signer. Many
|
||
applications achieve this by using public-key certificates issued by
|
||
a trusted third party. However, DKIM can achieve a sufficient level
|
||
of security, with significantly enhanced scalability, by simply
|
||
having the Verifier query the purported Signer's DNS entry (or some
|
||
security-equivalent) in order to retrieve the public key.
|
||
|
||
DKIM keys can potentially be stored in multiple types of key servers
|
||
and in multiple formats. The storage and format of keys are
|
||
irrelevant to the remainder of the DKIM algorithm.
|
||
|
||
Parameters to the key lookup algorithm are the type of the lookup
|
||
(the "q=" tag), the domain of the Signer (the "d=" tag of the DKIM-
|
||
Signature header field), and the selector (the "s=" tag).
|
||
|
||
public_key = dkim_find_key(q_val, d_val, s_val)
|
||
|
||
This document defines a single binding, using DNS TXT RRs to
|
||
distribute the keys. Other bindings may be defined in the future.
|
||
|
||
3.6.1. Textual Representation
|
||
|
||
It is expected that many key servers will choose to present the keys
|
||
in an otherwise unstructured text format (for example, an XML form
|
||
would not be considered to be unstructured text for this purpose).
|
||
The following definition MUST be used for any DKIM key represented in
|
||
an otherwise unstructured textual form.
|
||
|
||
The overall syntax is a tag-list as described in Section 3.2. The
|
||
current valid tags are described below. Other tags MAY be present
|
||
and MUST be ignored by any implementation that does not understand
|
||
them.
|
||
|
||
v= Version of the DKIM key record (plain-text; RECOMMENDED, default
|
||
is "DKIM1"). If specified, this tag MUST be set to "DKIM1"
|
||
(without the quotes). This tag MUST be the first tag in the
|
||
record. Records beginning with a "v=" tag with any other value
|
||
MUST be discarded. Note that Verifiers must do a string
|
||
comparison on this value; for example, "DKIM1" is not the same as
|
||
"DKIM1.0".
|
||
|
||
ABNF:
|
||
|
||
key-v-tag = %x76 [FWS] "=" [FWS] %x44.4B.49.4D.31
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 26]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
h= Acceptable hash algorithms (plain-text; OPTIONAL, defaults to
|
||
allowing all algorithms). A colon-separated list of hash
|
||
algorithms that might be used. Unrecognized algorithms MUST be
|
||
ignored. Refer to Section 3.3 for a discussion of the hash
|
||
algorithms implemented by Signers and Verifiers. The set of
|
||
algorithms listed in this tag in each record is an operational
|
||
choice made by the Signer.
|
||
|
||
ABNF:
|
||
|
||
key-h-tag = %x68 [FWS] "=" [FWS] key-h-tag-alg
|
||
*( [FWS] ":" [FWS] key-h-tag-alg )
|
||
key-h-tag-alg = "sha1" / "sha256" / x-key-h-tag-alg
|
||
x-key-h-tag-alg = hyphenated-word ; for future extension
|
||
|
||
k= Key type (plain-text; OPTIONAL, default is "rsa"). Signers and
|
||
Verifiers MUST support the "rsa" key type. The "rsa" key type
|
||
indicates that an ASN.1 DER-encoded [ITU-X660-1997] RSAPublicKey
|
||
(see [RFC3447], Sections 3.1 and A.1.1) is being used in the "p="
|
||
tag. (Note: the "p=" tag further encodes the value using the
|
||
base64 algorithm.) Unrecognized key types MUST be ignored.
|
||
|
||
ABNF:
|
||
|
||
key-k-tag = %x76 [FWS] "=" [FWS] key-k-tag-type
|
||
key-k-tag-type = "rsa" / x-key-k-tag-type
|
||
x-key-k-tag-type = hyphenated-word ; for future extension
|
||
|
||
n= Notes that might be of interest to a human (qp-section; OPTIONAL,
|
||
default is empty). No interpretation is made by any program.
|
||
This tag should be used sparingly in any key server mechanism that
|
||
has space limitations (notably DNS). This is intended for use by
|
||
administrators, not end users.
|
||
|
||
ABNF:
|
||
|
||
key-n-tag = %x6e [FWS] "=" [FWS] qp-section
|
||
|
||
p= Public-key data (base64; REQUIRED). An empty value means that
|
||
this public key has been revoked. The syntax and semantics of
|
||
this tag value before being encoded in base64 are defined by the
|
||
"k=" tag.
|
||
|
||
INFORMATIVE RATIONALE: If a private key has been compromised or
|
||
otherwise disabled (e.g., an outsourcing contract has been
|
||
terminated), a Signer might want to explicitly state that it
|
||
knows about the selector, but all messages using that selector
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 27]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
should fail verification. Verifiers SHOULD return an error
|
||
code for any DKIM-Signature header field with a selector
|
||
referencing a revoked key. (See Section 6.1.2 for details.)
|
||
|
||
ABNF:
|
||
|
||
key-p-tag = %x70 [FWS] "=" [ [FWS] base64string]
|
||
|
||
INFORMATIVE NOTE: A base64string is permitted to include
|
||
whitespace (FWS) at arbitrary places; however, any CRLFs must
|
||
be followed by at least one WSP character. Implementers and
|
||
administrators are cautioned to ensure that selector TXT RRs
|
||
conform to this specification.
|
||
|
||
s= Service Type (plain-text; OPTIONAL; default is "*"). A colon-
|
||
separated list of service types to which this record applies.
|
||
Verifiers for a given service type MUST ignore this record if the
|
||
appropriate type is not listed. Unrecognized service types MUST
|
||
be ignored. Currently defined service types are as follows:
|
||
|
||
* matches all service types
|
||
|
||
email electronic mail (not necessarily limited to SMTP)
|
||
|
||
This tag is intended to constrain the use of keys for other
|
||
purposes, should use of DKIM be defined by other services in the
|
||
future.
|
||
|
||
ABNF:
|
||
|
||
key-s-tag = %x73 [FWS] "=" [FWS] key-s-tag-type
|
||
*( [FWS] ":" [FWS] key-s-tag-type )
|
||
key-s-tag-type = "email" / "*" / x-key-s-tag-type
|
||
x-key-s-tag-type = hyphenated-word ; for future extension
|
||
|
||
t= Flags, represented as a colon-separated list of names (plain-
|
||
text; OPTIONAL, default is no flags set). Unrecognized flags MUST
|
||
be ignored. The defined flags are as follows:
|
||
|
||
y This domain is testing DKIM. Verifiers MUST NOT treat messages
|
||
from Signers in testing mode differently from unsigned email,
|
||
even should the signature fail to verify. Verifiers MAY wish
|
||
to track testing mode results to assist the Signer.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 28]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
s Any DKIM-Signature header fields using the "i=" tag MUST have
|
||
the same domain value on the right-hand side of the "@" in the
|
||
"i=" tag and the value of the "d=" tag. That is, the "i="
|
||
domain MUST NOT be a subdomain of "d=". Use of this flag is
|
||
RECOMMENDED unless subdomaining is required.
|
||
|
||
ABNF:
|
||
|
||
key-t-tag = %x74 [FWS] "=" [FWS] key-t-tag-flag
|
||
*( [FWS] ":" [FWS] key-t-tag-flag )
|
||
key-t-tag-flag = "y" / "s" / x-key-t-tag-flag
|
||
x-key-t-tag-flag = hyphenated-word ; for future extension
|
||
|
||
3.6.2. DNS Binding
|
||
|
||
A binding using DNS TXT RRs as a key service is hereby defined. All
|
||
implementations MUST support this binding.
|
||
|
||
3.6.2.1. Namespace
|
||
|
||
All DKIM keys are stored in a subdomain named "_domainkey". Given a
|
||
DKIM-Signature field with a "d=" tag of "example.com" and an "s=" tag
|
||
of "foo.bar", the DNS query will be for
|
||
"foo.bar._domainkey.example.com".
|
||
|
||
3.6.2.2. Resource Record Types for Key Storage
|
||
|
||
The DNS Resource Record type used is specified by an option to the
|
||
query-type ("q=") tag. The only option defined in this base
|
||
specification is "txt", indicating the use of a TXT RR. A later
|
||
extension of this standard may define another RR type.
|
||
|
||
Strings in a TXT RR MUST be concatenated together before use with no
|
||
intervening whitespace. TXT RRs MUST be unique for a particular
|
||
selector name; that is, if there are multiple records in an RRset,
|
||
the results are undefined.
|
||
|
||
TXT RRs are encoded as described in Section 3.6.1.
|
||
|
||
3.7. Computing the Message Hashes
|
||
|
||
Both signing and verifying message signatures start with a step of
|
||
computing two cryptographic hashes over the message. Signers will
|
||
choose the parameters of the signature as described in "Signer
|
||
Actions" (Section 5); Verifiers will use the parameters specified in
|
||
the DKIM-Signature header field being verified. In the following
|
||
discussion, the names of the tags in the DKIM-Signature header field
|
||
that either exists (when verifying) or will be created (when signing)
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 29]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
are used. Note that canonicalization (Section 3.4) is only used to
|
||
prepare the email for signing or verifying; it does not affect the
|
||
transmitted email in any way.
|
||
|
||
The Signer/Verifier MUST compute two hashes: one over the body of the
|
||
message and one over the selected header fields of the message.
|
||
|
||
Signers MUST compute them in the order shown. Verifiers MAY compute
|
||
them in any order convenient to the Verifier, provided that the
|
||
result is semantically identical to the semantics that would be the
|
||
case had they been computed in this order.
|
||
|
||
In hash step 1, the Signer/Verifier MUST hash the message body,
|
||
canonicalized using the body canonicalization algorithm specified in
|
||
the "c=" tag and then truncated to the length specified in the "l="
|
||
tag. That hash value is then converted to base64 form and inserted
|
||
into (Signers) or compared to (Verifiers) the "bh=" tag of the DKIM-
|
||
Signature header field.
|
||
|
||
In hash step 2, the Signer/Verifier MUST pass the following to the
|
||
hash algorithm in the indicated order.
|
||
|
||
1. The header fields specified by the "h=" tag, in the order
|
||
specified in that tag, and canonicalized using the header
|
||
canonicalization algorithm specified in the "c=" tag. Each
|
||
header field MUST be terminated with a single CRLF.
|
||
|
||
2. The DKIM-Signature header field that exists (verifying) or will
|
||
be inserted (signing) in the message, with the value of the "b="
|
||
tag (including all surrounding whitespace) deleted (i.e., treated
|
||
as the empty string), canonicalized using the header
|
||
canonicalization algorithm specified in the "c=" tag, and without
|
||
a trailing CRLF.
|
||
|
||
All tags and their values in the DKIM-Signature header field are
|
||
included in the cryptographic hash with the sole exception of the
|
||
value portion of the "b=" (signature) tag, which MUST be treated as
|
||
the null string. All tags MUST be included even if they might not be
|
||
understood by the Verifier. The header field MUST be presented to
|
||
the hash algorithm after the body of the message rather than with the
|
||
rest of the header fields and MUST be canonicalized as specified in
|
||
the "c=" (canonicalization) tag. The DKIM-Signature header field
|
||
MUST NOT be included in its own "h=" tag, although other DKIM-
|
||
Signature header fields MAY be signed (see Section 4).
|
||
|
||
When calculating the hash on messages that will be transmitted using
|
||
base64 or quoted-printable encoding, Signers MUST compute the hash
|
||
after the encoding. Likewise, the Verifier MUST incorporate the
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 30]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
values into the hash before decoding the base64 or quoted-printable
|
||
text. However, the hash MUST be computed before transport-level
|
||
encodings such as SMTP "dot-stuffing" (the modification of lines
|
||
beginning with a "." to avoid confusion with the SMTP end-of-message
|
||
marker, as specified in [RFC5321]).
|
||
|
||
With the exception of the canonicalization procedure described in
|
||
Section 3.4, the DKIM signing process treats the body of messages as
|
||
simply a string of octets. DKIM messages MAY be either in plain-text
|
||
or in MIME format; no special treatment is afforded to MIME content.
|
||
Message attachments in MIME format MUST be included in the content
|
||
that is signed.
|
||
|
||
More formally, pseudo-code for the signature algorithm is:
|
||
|
||
body-hash = hash-alg (canon-body, l-param)
|
||
data-hash = hash-alg (h-headers, D-SIG, body-hash)
|
||
signature = sig-alg (d-domain, selector, data-hash)
|
||
|
||
where:
|
||
|
||
body-hash: is the output from hashing the body, using hash-alg.
|
||
|
||
hash-alg: is the hashing algorithm specified in the "a" parameter.
|
||
|
||
canon-body: is a canonicalized representation of the body, produced
|
||
using the body algorithm specified in the "c" parameter,
|
||
as defined in Section 3.4 and excluding the
|
||
DKIM-Signature field.
|
||
|
||
l-param: is the length-of-body value of the "l" parameter.
|
||
|
||
data-hash: is the output from using the hash-alg algorithm, to hash
|
||
the header including the DKIM-Signature header, and the
|
||
body hash.
|
||
|
||
h-headers: is the list of headers to be signed, as specified in the
|
||
"h" parameter.
|
||
|
||
D-SIG: is the canonicalized DKIM-Signature field itself without
|
||
the signature value portion of the parameter, that is, an
|
||
empty parameter value.
|
||
|
||
signature: is the signature value produced by the signing algorithm.
|
||
|
||
sig-alg: is the signature algorithm specified by the "a"
|
||
parameter.
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 31]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
d-domain: is the domain name specified in the "d" parameter.
|
||
|
||
selector: is the selector value specified in the "s" parameter.
|
||
|
||
NOTE: Many digital signature APIs provide both hashing and
|
||
application of the RSA private key using a single "sign()"
|
||
primitive. When using such an API, the last two steps in the
|
||
algorithm would probably be combined into a single call that would
|
||
perform both the "a-hash-alg" and the "sig-alg".
|
||
|
||
3.8. Input Requirements
|
||
|
||
A message that is not compliant with [RFC5322], [RFC2045], and
|
||
[RFC2047] can be subject to attempts by intermediaries to correct or
|
||
interpret such content. See Section 8 of [RFC4409] for examples of
|
||
changes that are commonly made. Such "corrections" may invalidate
|
||
DKIM signatures or have other undesirable effects, including some
|
||
that involve changes to the way a message is presented to an end
|
||
user.
|
||
|
||
Accordingly, DKIM's design is predicated on valid input. Therefore,
|
||
Signers and Verifiers SHOULD take reasonable steps to ensure that the
|
||
messages they are processing are valid according to [RFC5322],
|
||
[RFC2045], and any other relevant message format standards.
|
||
|
||
See Section 8.15 for additional discussion.
|
||
|
||
3.9. Output Requirements
|
||
|
||
The evaluation of each signature ends in one of three states, which
|
||
this document refers to as follows:
|
||
|
||
SUCCESS: a successful verification
|
||
|
||
PERMFAIL: a permanent, non-recoverable error such as a signature
|
||
verification failure
|
||
|
||
TEMPFAIL: a temporary, recoverable error such as a DNS query timeout
|
||
|
||
For each signature that verifies successfully or produces a TEMPFAIL
|
||
result, output of the DKIM algorithm MUST include the set of:
|
||
|
||
o The domain name, taken from the "d=" signature tag; and
|
||
|
||
o The result of the verification attempt for that signature.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 32]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
The output MAY include other signature properties or result meta-
|
||
data, including PERMFAILed or otherwise ignored signatures, for use
|
||
by modules that consume those results.
|
||
|
||
See Section 6.1 for discussion of signature validation result codes.
|
||
|
||
3.10. Signing by Parent Domains
|
||
|
||
In some circumstances, it is desirable for a domain to apply a
|
||
signature on behalf of any of its subdomains without the need to
|
||
maintain separate selectors (key records) in each subdomain. By
|
||
default, private keys corresponding to key records can be used to
|
||
sign messages for any subdomain of the domain in which they reside;
|
||
for example, a key record for the domain example.com can be used to
|
||
verify messages where the AUID ("i=" tag of the signature) is
|
||
sub.example.com, or even sub1.sub2.example.com. In order to limit
|
||
the capability of such keys when this is not intended, the "s" flag
|
||
MAY be set in the "t=" tag of the key record, to constrain the
|
||
validity of the domain of the AUID. If the referenced key record
|
||
contains the "s" flag as part of the "t=" tag, the domain of the AUID
|
||
("i=" flag) MUST be the same as that of the SDID (d=) domain. If
|
||
this flag is absent, the domain of the AUID MUST be the same as, or a
|
||
subdomain of, the SDID.
|
||
|
||
3.11. Relationship between SDID and AUID
|
||
|
||
DKIM's primary task is to communicate from the Signer to a recipient-
|
||
side Identity Assessor a single Signing Domain Identifier (SDID) that
|
||
refers to a responsible identity. DKIM MAY optionally provide a
|
||
single responsible Agent or User Identifier (AUID).
|
||
|
||
Hence, DKIM's mandatory output to a receive-side Identity Assessor is
|
||
a single domain name. Within the scope of its use as DKIM output,
|
||
the name has only basic domain name semantics; any possible owner-
|
||
specific semantics are outside the scope of DKIM. That is, within
|
||
its role as a DKIM identifier, additional semantics cannot be assumed
|
||
by an Identity Assessor.
|
||
|
||
Upon successfully verifying the signature, a receive-side DKIM
|
||
Verifier MUST communicate the Signing Domain Identifier (d=) to a
|
||
consuming Identity Assessor module and MAY communicate the Agent or
|
||
User Identifier (i=) if present.
|
||
|
||
To the extent that a receiver attempts to intuit any structured
|
||
semantics for either of the identifiers, this is a heuristic function
|
||
that is outside the scope of DKIM's specification and semantics.
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 33]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Hence, it is relegated to a higher-level service, such as a delivery-
|
||
handling filter that integrates a variety of inputs and performs
|
||
heuristic analysis of them.
|
||
|
||
INFORMATIVE DISCUSSION: This document does not require the value
|
||
of the SDID or AUID to match an identifier in any other message
|
||
header field. This requirement is, instead, an Assessor policy
|
||
issue. The purpose of such a linkage would be to authenticate the
|
||
value in that other header field. This, in turn, is the basis for
|
||
applying a trust assessment based on the identifier value. Trust
|
||
is a broad and complex topic, and trust mechanisms are subject to
|
||
highly creative attacks. The real-world efficacy of any but the
|
||
most basic bindings between the SDID or AUID and other identities
|
||
is not well established, nor is its vulnerability to subversion by
|
||
an attacker. Hence, reliance on the use of such bindings should
|
||
be strictly limited. In particular, it is not at all clear to
|
||
what extent a typical end-user recipient can rely on any
|
||
assurances that might be made by successful use of the SDID or
|
||
AUID.
|
||
|
||
4. Semantics of Multiple Signatures
|
||
|
||
4.1. Example Scenarios
|
||
|
||
There are many reasons why a message might have multiple signatures.
|
||
For example, suppose SHA-256 is in the future found to be
|
||
insufficiently strong, and DKIM usage transitions to SHA-1024. A
|
||
Signer might immediately sign using the newer algorithm but also
|
||
continue to sign using the older algorithm for interoperability with
|
||
Verifiers that had not yet upgraded. The Signer would do this by
|
||
adding two DKIM-Signature header fields, one using each algorithm.
|
||
Older Verifiers that did not recognize SHA-1024 as an acceptable
|
||
algorithm would skip that signature and use the older algorithm;
|
||
newer Verifiers could use either signature at their option and, all
|
||
other things being equal, might not even attempt to verify the other
|
||
signature.
|
||
|
||
Similarly, a Signer might sign a message including all header fields
|
||
and no "l=" tag (to satisfy strict Verifiers) and a second time with
|
||
a limited set of header fields and an "l=" tag (in anticipation of
|
||
possible message modifications en route to other Verifiers).
|
||
Verifiers could then choose which signature they prefer.
|
||
|
||
Of course, a message might also have multiple signatures because it
|
||
passed through multiple Signers. A common case is expected to be
|
||
that of a signed message that passes through a mailing list that also
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 34]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
signs all messages. Assuming both of those signatures verify, a
|
||
recipient might choose to accept the message if either of those
|
||
signatures were known to come from trusted sources.
|
||
|
||
In particular, recipients might choose to whitelist mailing lists to
|
||
which they have subscribed and that have acceptable anti-abuse
|
||
policies so as to accept messages sent to that list even from unknown
|
||
authors. They might also subscribe to less trusted mailing lists
|
||
(e.g., those without anti-abuse protection) and be willing to accept
|
||
all messages from specific authors but insist on doing additional
|
||
abuse scanning for other messages.
|
||
|
||
Another related example of multiple Signers might be forwarding
|
||
services, such as those commonly associated with academic alumni
|
||
sites. For example, a recipient might have an address at
|
||
members.example.org, a site that has anti-abuse protection that is
|
||
somewhat less effective than the recipient would prefer. Such a
|
||
recipient might have specific authors whose messages would be trusted
|
||
absolutely, but messages from unknown authors that had passed the
|
||
forwarder's scrutiny would have only medium trust.
|
||
|
||
4.2. Interpretation
|
||
|
||
A Signer that is adding a signature to a message merely creates a new
|
||
DKIM-Signature header, using the usual semantics of the "h=" option.
|
||
A Signer MAY sign previously existing DKIM-Signature header fields
|
||
using the method described in Section 5.4 to sign trace header
|
||
fields.
|
||
|
||
Note that Signers should be cognizant that signing DKIM-Signature
|
||
header fields may result in signature failures with intermediaries
|
||
that do not recognize that DKIM-Signature header fields are trace
|
||
header fields and unwittingly reorder them, thus breaking such
|
||
signatures. For this reason, signing existing DKIM-Signature header
|
||
fields is unadvised, albeit legal.
|
||
|
||
INFORMATIVE NOTE: If a header field with multiple instances is
|
||
signed, those header fields are always signed from the bottom up.
|
||
Thus, it is not possible to sign only specific DKIM-Signature
|
||
header fields. For example, if the message being signed already
|
||
contains three DKIM-Signature header fields A, B, and C, it is
|
||
possible to sign all of them, B and C only, or C only, but not A
|
||
only, B only, A and B only, or A and C only.
|
||
|
||
A Signer MAY add more than one DKIM-Signature header field using
|
||
different parameters. For example, during a transition period, a
|
||
Signer might want to produce signatures using two different hash
|
||
algorithms.
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 35]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Signers SHOULD NOT remove any DKIM-Signature header fields from
|
||
messages they are signing, even if they know that the signatures
|
||
cannot be verified.
|
||
|
||
When evaluating a message with multiple signatures, a Verifier SHOULD
|
||
evaluate signatures independently and on their own merits. For
|
||
example, a Verifier that by policy chooses not to accept signatures
|
||
with deprecated cryptographic algorithms would consider such
|
||
signatures invalid. Verifiers MAY process signatures in any order of
|
||
their choice; for example, some Verifiers might choose to process
|
||
signatures corresponding to the From field in the message header
|
||
before other signatures. See Section 6.1 for more information about
|
||
signature choices.
|
||
|
||
INFORMATIVE IMPLEMENTATION NOTE: Verifier attempts to correlate
|
||
valid signatures with invalid signatures in an attempt to guess
|
||
why a signature failed are ill-advised. In particular, there is
|
||
no general way that a Verifier can determine that an invalid
|
||
signature was ever valid.
|
||
|
||
Verifiers SHOULD continue to check signatures until a signature
|
||
successfully verifies to the satisfaction of the Verifier. To limit
|
||
potential denial-of-service attacks, Verifiers MAY limit the total
|
||
number of signatures they will attempt to verify.
|
||
|
||
If a Verifier module reports signatures whose evaluations produced
|
||
PERMFAIL results, Identity Assessors SHOULD ignore those signatures
|
||
(see Section 6.1), acting as though they were not present in the
|
||
message.
|
||
|
||
5. Signer Actions
|
||
|
||
The following steps are performed in order by Signers.
|
||
|
||
5.1. Determine Whether the Email Should Be Signed and by Whom
|
||
|
||
A Signer can obviously only sign email for domains for which it has a
|
||
private key and the necessary knowledge of the corresponding public
|
||
key and selector information. However, there are a number of other
|
||
reasons beyond the lack of a private key why a Signer could choose
|
||
not to sign an email.
|
||
|
||
INFORMATIVE NOTE: A Signer can be implemented as part of any
|
||
portion of the mail system as deemed appropriate, including an
|
||
MUA, a SUBMISSION server, or an MTA. Wherever implemented,
|
||
Signers should beware of signing (and thereby asserting
|
||
responsibility for) messages that may be problematic. In
|
||
particular, within a trusted enclave, the signing domain might be
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 36]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
derived from the header according to local policy; SUBMISSION
|
||
servers might only sign messages from users that are properly
|
||
authenticated and authorized.
|
||
|
||
INFORMATIVE IMPLEMENTER ADVICE: SUBMISSION servers should not sign
|
||
Received header fields if the outgoing gateway MTA obfuscates
|
||
Received header fields, for example, to hide the details of
|
||
internal topology.
|
||
|
||
If an email cannot be signed for some reason, it is a local policy
|
||
decision as to what to do with that email.
|
||
|
||
5.2. Select a Private Key and Corresponding Selector Information
|
||
|
||
This specification does not define the basis by which a Signer should
|
||
choose which private key and selector information to use. Currently,
|
||
all selectors are equal as far as this specification is concerned, so
|
||
the decision should largely be a matter of administrative
|
||
convenience. Distribution and management of private keys is also
|
||
outside the scope of this document.
|
||
|
||
INFORMATIVE OPERATIONS ADVICE: A Signer should not sign with a
|
||
private key when the selector containing the corresponding public
|
||
key is expected to be revoked or removed before the Verifier has
|
||
an opportunity to validate the signature. The Signer should
|
||
anticipate that Verifiers can choose to defer validation, perhaps
|
||
until the message is actually read by the final recipient. In
|
||
particular, when rotating to a new key pair, signing should
|
||
immediately commence with the new private key, and the old public
|
||
key should be retained for a reasonable validation interval before
|
||
being removed from the key server.
|
||
|
||
5.3. Normalize the Message to Prevent Transport Conversions
|
||
|
||
Some messages, particularly those using 8-bit characters, are subject
|
||
to modification during transit, notably conversion to 7-bit form.
|
||
Such conversions will break DKIM signatures. In order to minimize
|
||
the chances of such breakage, Signers SHOULD convert the message to a
|
||
suitable MIME content-transfer encoding such as quoted-printable or
|
||
base64 as described in [RFC2045] before signing. Such conversion is
|
||
outside the scope of DKIM; the actual message SHOULD be converted to
|
||
7-bit MIME by an MUA or MSA prior to presentation to the DKIM
|
||
algorithm.
|
||
|
||
If the message is submitted to the Signer with any local encoding
|
||
that will be modified before transmission, that modification to
|
||
canonical [RFC5322] form MUST be done before signing. In particular,
|
||
bare CR or LF characters (used by some systems as a local line
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 37]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
separator convention) MUST be converted to the SMTP-standard CRLF
|
||
sequence before the message is signed. Any conversion of this sort
|
||
SHOULD be applied to the message actually sent to the recipient(s),
|
||
not just to the version presented to the signing algorithm.
|
||
|
||
More generally, the Signer MUST sign the message as it is expected to
|
||
be received by the Verifier rather than in some local or internal
|
||
form.
|
||
|
||
5.3.1. Body Length Limits
|
||
|
||
A body length count MAY be specified to limit the signature
|
||
calculation to an initial prefix of the body text, measured in
|
||
octets. If the body length count is not specified, the entire
|
||
message body is signed.
|
||
|
||
INFORMATIVE RATIONALE: This capability is provided because it is
|
||
very common for mailing lists to add trailers to messages (e.g.,
|
||
instructions on how to get off the list). Until those messages
|
||
are also signed, the body length count is a useful tool for the
|
||
Verifier since it can, as a matter of policy, accept messages
|
||
having valid signatures with extraneous data.
|
||
|
||
The length actually hashed should be inserted in the "l=" tag of the
|
||
DKIM-Signature header field. (See Section 3.5.)
|
||
|
||
The body length count allows the Signer of a message to permit data
|
||
to be appended to the end of the body of a signed message. The body
|
||
length count MUST be calculated following the canonicalization
|
||
algorithm; for example, any whitespace ignored by a canonicalization
|
||
algorithm is not included as part of the body length count.
|
||
|
||
A body length count of zero means that the body is completely
|
||
unsigned.
|
||
|
||
Signers wishing to ensure that no modification of any sort can occur
|
||
should specify the "simple" canonicalization algorithm for both
|
||
header and body and omit the body length count.
|
||
|
||
See Section 8.2 for further discussion.
|
||
|
||
5.4. Determine the Header Fields to Sign
|
||
|
||
The From header field MUST be signed (that is, included in the "h="
|
||
tag of the resulting DKIM-Signature header field). Signers SHOULD
|
||
NOT sign an existing header field likely to be legitimately modified
|
||
or removed in transit. In particular, [RFC5321] explicitly permits
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 38]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
modification or removal of the Return-Path header field in transit.
|
||
Signers MAY include any other header fields present at the time of
|
||
signing at the discretion of the Signer.
|
||
|
||
INFORMATIVE OPERATIONS NOTE: The choice of which header fields to
|
||
sign is non-obvious. One strategy is to sign all existing, non-
|
||
repeatable header fields. An alternative strategy is to sign only
|
||
header fields that are likely to be displayed to or otherwise be
|
||
likely to affect the processing of the message at the receiver. A
|
||
third strategy is to sign only "well-known" headers. Note that
|
||
Verifiers may treat unsigned header fields with extreme
|
||
skepticism, including refusing to display them to the end user or
|
||
even ignoring the signature if it does not cover certain header
|
||
fields. For this reason, signing fields present in the message
|
||
such as Date, Subject, Reply-To, Sender, and all MIME header
|
||
fields are highly advised.
|
||
|
||
The DKIM-Signature header field is always implicitly signed and MUST
|
||
NOT be included in the "h=" tag except to indicate that other
|
||
preexisting signatures are also signed.
|
||
|
||
Signers MAY claim to have signed header fields that do not exist
|
||
(that is, Signers MAY include the header field name in the "h=" tag
|
||
even if that header field does not exist in the message). When
|
||
computing the signature, the nonexisting header field MUST be treated
|
||
as the null string (including the header field name, header field
|
||
value, all punctuation, and the trailing CRLF).
|
||
|
||
INFORMATIVE RATIONALE: This allows Signers to explicitly assert
|
||
the absence of a header field; if that header field is added
|
||
later, the signature will fail.
|
||
|
||
INFORMATIVE NOTE: A header field name need only be listed once
|
||
more than the actual number of that header field in a message at
|
||
the time of signing in order to prevent any further additions.
|
||
For example, if there is a single Comments header field at the
|
||
time of signing, listing Comments twice in the "h=" tag is
|
||
sufficient to prevent any number of Comments header fields from
|
||
being appended; it is not necessary (but is legal) to list
|
||
Comments three or more times in the "h=" tag.
|
||
|
||
Refer to Section 5.4.2 for a discussion of the procedure to be
|
||
followed when canonicalizing a header with more than one instance of
|
||
a particular header field name.
|
||
|
||
Signers need to be careful of signing header fields that might have
|
||
additional instances added later in the delivery process, since such
|
||
header fields might be inserted after the signed instance or
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 39]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
otherwise reordered. Trace header fields (such as Received) and
|
||
Resent-* blocks are the only fields prohibited by [RFC5322] from
|
||
being reordered. In particular, since DKIM-Signature header fields
|
||
may be reordered by some intermediate MTAs, signing existing DKIM-
|
||
Signature header fields is error-prone.
|
||
|
||
INFORMATIVE ADMONITION: Despite the fact that [RFC5322] does not
|
||
prohibit the reordering of header fields, reordering of signed
|
||
header fields with multiple instances by intermediate MTAs will
|
||
cause DKIM signatures to be broken; such antisocial behavior
|
||
should be avoided.
|
||
|
||
INFORMATIVE IMPLEMENTER'S NOTE: Although not required by this
|
||
specification, all end-user visible header fields should be signed
|
||
to avoid possible "indirect spamming". For example, if the
|
||
Subject header field is not signed, a spammer can resend a
|
||
previously signed mail, replacing the legitimate subject with a
|
||
one-line spam.
|
||
|
||
5.4.1. Recommended Signature Content
|
||
|
||
The purpose of the DKIM cryptographic algorithm is to affix an
|
||
identifier to the message in a way that is both robust against normal
|
||
transit-related changes and resistant to kinds of replay attacks. An
|
||
essential aspect of satisfying these requirements is choosing what
|
||
header fields to include in the hash and what fields to exclude.
|
||
|
||
The basic rule for choosing fields to include is to select those
|
||
fields that constitute the "core" of the message content. Hence, any
|
||
replay attack will have to include these in order to have the
|
||
signature succeed; however, with these included, the core of the
|
||
message is valid, even if sent on to new recipients.
|
||
|
||
Common examples of fields with addresses and fields with textual
|
||
content related to the body are:
|
||
|
||
o From (REQUIRED; see Section 5.4)
|
||
|
||
o Reply-To
|
||
|
||
o Subject
|
||
|
||
o Date
|
||
|
||
o To, Cc
|
||
|
||
o Resent-Date, Resent-From, Resent-To, Resent-Cc
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 40]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
o In-Reply-To, References
|
||
|
||
o List-Id, List-Help, List-Unsubscribe, List-Subscribe, List-Post,
|
||
List-Owner, List-Archive
|
||
|
||
If the "l=" signature tag is in use (see Section 3.5), the Content-
|
||
Type field is also a candidate for being included as it could be
|
||
replaced in a way that causes completely different content to be
|
||
rendered to the receiving user.
|
||
|
||
There are trade-offs in the decision of what constitutes the "core"
|
||
of the message, which for some fields is a subjective concept.
|
||
Including fields such as "Message-ID", for example, is useful if one
|
||
considers a mechanism for being able to distinguish separate
|
||
instances of the same message to be core content. Similarly, "In-
|
||
Reply-To" and "References" might be desirable to include if one
|
||
considers message threading to be a core part of the message.
|
||
|
||
Another class of fields that may be of interest are those that convey
|
||
security-related information about the message, such as
|
||
Authentication-Results [RFC5451].
|
||
|
||
The basic rule for choosing fields to exclude is to select those
|
||
fields for which there are multiple fields with the same name and
|
||
fields that are modified in transit. Examples of these are:
|
||
|
||
o Return-Path
|
||
|
||
o Received
|
||
|
||
o Comments, Keywords
|
||
|
||
Note that the DKIM-Signature field is also excluded from the header
|
||
hash because its handling is specified separately.
|
||
|
||
Typically, it is better to exclude other optional fields because of
|
||
the potential that additional fields of the same name will be
|
||
legitimately added or reordered prior to verification. There are
|
||
likely to be legitimate exceptions to this rule because of the wide
|
||
variety of application-specific header fields that might be applied
|
||
to a message, some of which are unlikely to be duplicated, modified,
|
||
or reordered.
|
||
|
||
Signers SHOULD choose canonicalization algorithms based on the types
|
||
of messages they process and their aversion to risk. For example,
|
||
e-commerce sites sending primarily purchase receipts, which are not
|
||
expected to be processed by mailing lists or other software likely to
|
||
modify messages, will generally prefer "simple" canonicalization.
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 41]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Sites sending primarily person-to-person email will likely prefer to
|
||
be more resilient to modification during transport by using "relaxed"
|
||
canonicalization.
|
||
|
||
Unless mail is processed through intermediaries, such as mailing
|
||
lists that might add "unsubscribe" instructions to the bottom of the
|
||
message body, the "l=" tag is likely to convey no additional benefit
|
||
while providing an avenue for unauthorized addition of text to a
|
||
message. The use of "l=0" takes this to the extreme, allowing
|
||
complete alteration of the text of the message without invalidating
|
||
the signature. Moreover, a Verifier would be within its rights to
|
||
consider a partly signed message body as unacceptable. Judicious use
|
||
is advised.
|
||
|
||
5.4.2. Signatures Involving Multiple Instances of a Field
|
||
|
||
Signers choosing to sign an existing header field that occurs more
|
||
than once in the message (such as Received) MUST sign the physically
|
||
last instance of that header field in the header block. Signers
|
||
wishing to sign multiple instances of such a header field MUST
|
||
include the header field name multiple times in the "h=" tag of the
|
||
DKIM-Signature header field and MUST sign such header fields in order
|
||
from the bottom of the header field block to the top. The Signer MAY
|
||
include more instances of a header field name in "h=" than there are
|
||
actual corresponding header fields so that the signature will not
|
||
verify if additional header fields of that name are added.
|
||
|
||
INFORMATIVE EXAMPLE:
|
||
|
||
If the Signer wishes to sign two existing Received header fields,
|
||
and the existing header contains:
|
||
|
||
Received: <A>
|
||
Received: <B>
|
||
Received: <C>
|
||
|
||
then the resulting DKIM-Signature header field should read:
|
||
|
||
DKIM-Signature: ... h=Received : Received :...
|
||
|
||
and Received header fields <C> and <B> will be signed in that
|
||
order.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 42]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
5.5. Compute the Message Hash and Signature
|
||
|
||
The Signer MUST compute the message hash as described in Section 3.7
|
||
and then sign it using the selected public-key algorithm. This will
|
||
result in a DKIM-Signature header field that will include the body
|
||
hash and a signature of the header hash, where that header includes
|
||
the DKIM-Signature header field itself.
|
||
|
||
Entities such as mailing list managers that implement DKIM and that
|
||
modify the message or a header field (for example, inserting
|
||
unsubscribe information) before retransmitting the message SHOULD
|
||
check any existing signature on input and MUST make such
|
||
modifications before re-signing the message.
|
||
|
||
5.6. Insert the DKIM-Signature Header Field
|
||
|
||
Finally, the Signer MUST insert the DKIM-Signature header field
|
||
created in the previous step prior to transmitting the email. The
|
||
DKIM-Signature header field MUST be the same as used to compute the
|
||
hash as described above, except that the value of the "b=" tag MUST
|
||
be the appropriately signed hash computed in the previous step,
|
||
signed using the algorithm specified in the "a=" tag of the DKIM-
|
||
Signature header field and using the private key corresponding to the
|
||
selector given in the "s=" tag of the DKIM-Signature header field, as
|
||
chosen above in Section 5.2.
|
||
|
||
The DKIM-Signature header field MUST be inserted before any other
|
||
DKIM-Signature fields in the header block.
|
||
|
||
INFORMATIVE IMPLEMENTATION NOTE: The easiest way to achieve this
|
||
is to insert the DKIM-Signature header field at the beginning of
|
||
the header block. In particular, it may be placed before any
|
||
existing Received header fields. This is consistent with treating
|
||
DKIM-Signature as a trace header field.
|
||
|
||
6. Verifier Actions
|
||
|
||
Since a Signer MAY remove or revoke a public key at any time, it is
|
||
advised that verification occur in a timely manner. In many
|
||
configurations, the most timely place is during acceptance by the
|
||
border MTA or shortly thereafter. In particular, deferring
|
||
verification until the message is accessed by the end user is
|
||
discouraged.
|
||
|
||
A border or intermediate MTA MAY verify the message signature(s). An
|
||
MTA who has performed verification MAY communicate the result of that
|
||
verification by adding a verification header field to incoming
|
||
messages. This simplifies things considerably for the user, who can
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 43]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
now use an existing mail user agent. Most MUAs have the ability to
|
||
filter messages based on message header fields or content; these
|
||
filters would be used to implement whatever policy the user wishes
|
||
with respect to unsigned mail.
|
||
|
||
A verifying MTA MAY implement a policy with respect to unverifiable
|
||
mail, regardless of whether or not it applies the verification header
|
||
field to signed messages.
|
||
|
||
Verifiers MUST produce a result that is semantically equivalent to
|
||
applying the steps listed in Sections 6.1, 6.1.1, and 6.1.2 in order.
|
||
In practice, several of these steps can be performed in parallel in
|
||
order to improve performance.
|
||
|
||
6.1. Extract Signatures from the Message
|
||
|
||
The order in which Verifiers try DKIM-Signature header fields is not
|
||
defined; Verifiers MAY try signatures in any order they like. For
|
||
example, one implementation might try the signatures in textual
|
||
order, whereas another might try signatures by identities that match
|
||
the contents of the From header field before trying other signatures.
|
||
Verifiers MUST NOT attribute ultimate meaning to the order of
|
||
multiple DKIM-Signature header fields. In particular, there is
|
||
reason to believe that some relays will reorder the header fields in
|
||
potentially arbitrary ways.
|
||
|
||
INFORMATIVE IMPLEMENTATION NOTE: Verifiers might use the order as
|
||
a clue to signing order in the absence of any other information.
|
||
However, other clues as to the semantics of multiple signatures
|
||
(such as correlating the signing host with Received header fields)
|
||
might also be considered.
|
||
|
||
Survivability of signatures after transit is not guaranteed, and
|
||
signatures can fail to verify through no fault of the Signer.
|
||
Therefore, a Verifier SHOULD NOT treat a message that has one or more
|
||
bad signatures and no good signatures differently from a message with
|
||
no signature at all.
|
||
|
||
When a signature successfully verifies, a Verifier will either stop
|
||
processing or attempt to verify any other signatures, at the
|
||
discretion of the implementation. A Verifier MAY limit the number of
|
||
signatures it tries, in order to avoid denial-of-service attacks (see
|
||
Section 8.4 for further discussion).
|
||
|
||
In the following description, text reading "return status
|
||
(explanation)" (where "status" is one of "PERMFAIL" or "TEMPFAIL")
|
||
means that the Verifier MUST immediately cease processing that
|
||
signature. The Verifier SHOULD proceed to the next signature, if one
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 44]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
is present, and completely ignore the bad signature. If the status
|
||
is "PERMFAIL", the signature failed and should not be reconsidered.
|
||
If the status is "TEMPFAIL", the signature could not be verified at
|
||
this time but may be tried again later. A Verifier MAY either
|
||
arrange to defer the message for later processing or try another
|
||
signature; if no good signature is found and any of the signatures
|
||
resulted in a TEMPFAIL status, the Verifier MAY arrange to defer the
|
||
message for later processing. The "(explanation)" is not normative
|
||
text; it is provided solely for clarification.
|
||
|
||
Verifiers that are prepared to validate multiple signature header
|
||
fields SHOULD proceed to the next signature header field, if one
|
||
exists. However, Verifiers MAY make note of the fact that an invalid
|
||
signature was present for consideration at a later step.
|
||
|
||
INFORMATIVE NOTE: The rationale of this requirement is to permit
|
||
messages that have invalid signatures but also a valid signature
|
||
to work. For example, a mailing list exploder might opt to leave
|
||
the original submitter signature in place even though the exploder
|
||
knows that it is modifying the message in some way that will break
|
||
that signature, and the exploder inserts its own signature. In
|
||
this case, the message should succeed even in the presence of the
|
||
known-broken signature.
|
||
|
||
For each signature to be validated, the following steps should be
|
||
performed in such a manner as to produce a result that is
|
||
semantically equivalent to performing them in the indicated order.
|
||
|
||
6.1.1. Validate the Signature Header Field
|
||
|
||
Implementers MUST meticulously validate the format and values in the
|
||
DKIM-Signature header field; any inconsistency or unexpected values
|
||
MUST cause the header field to be completely ignored and the Verifier
|
||
to return PERMFAIL (signature syntax error). Being "liberal in what
|
||
you accept" is definitely a bad strategy in this security context.
|
||
Note, however, that this does not include the existence of unknown
|
||
tags in a DKIM-Signature header field, which are explicitly
|
||
permitted. Verifiers MUST return PERMFAIL (incompatible version)
|
||
when presented a DKIM-Signature header field with a "v=" tag that is
|
||
inconsistent with this specification.
|
||
|
||
INFORMATIVE IMPLEMENTATION NOTE: An implementation may, of course,
|
||
choose to also verify signatures generated by older versions of
|
||
this specification.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 45]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
If any tag listed as "required" in Section 3.5 is omitted from the
|
||
DKIM-Signature header field, the Verifier MUST ignore the DKIM-
|
||
Signature header field and return PERMFAIL (signature missing
|
||
required tag).
|
||
|
||
INFORMATIVE NOTE: The tags listed as required in Section 3.5 are
|
||
"v=", "a=", "b=", "bh=", "d=", "h=", and "s=". Should there be a
|
||
conflict between this note and Section 3.5, Section 3.5 is
|
||
normative.
|
||
|
||
If the DKIM-Signature header field does not contain the "i=" tag, the
|
||
Verifier MUST behave as though the value of that tag were "@d", where
|
||
"d" is the value from the "d=" tag.
|
||
|
||
Verifiers MUST confirm that the domain specified in the "d=" tag is
|
||
the same as or a parent domain of the domain part of the "i=" tag.
|
||
If not, the DKIM-Signature header field MUST be ignored, and the
|
||
Verifier should return PERMFAIL (domain mismatch).
|
||
|
||
If the "h=" tag does not include the From header field, the Verifier
|
||
MUST ignore the DKIM-Signature header field and return PERMFAIL (From
|
||
field not signed).
|
||
|
||
Verifiers MAY ignore the DKIM-Signature header field and return
|
||
PERMFAIL (signature expired) if it contains an "x=" tag and the
|
||
signature has expired.
|
||
|
||
Verifiers MAY ignore the DKIM-Signature header field if the domain
|
||
used by the Signer in the "d=" tag is not associated with a valid
|
||
signing entity. For example, signatures with "d=" values such as
|
||
"com" and "co.uk" could be ignored. The list of unacceptable domains
|
||
SHOULD be configurable.
|
||
|
||
Verifiers MAY ignore the DKIM-Signature header field and return
|
||
PERMFAIL (unacceptable signature header) for any other reason, for
|
||
example, if the signature does not sign header fields that the
|
||
Verifier views to be essential. As a case in point, if MIME header
|
||
fields are not signed, certain attacks may be possible that the
|
||
Verifier would prefer to avoid.
|
||
|
||
6.1.2. Get the Public Key
|
||
|
||
The public key for a signature is needed to complete the verification
|
||
process. The process of retrieving the public key depends on the
|
||
query type as defined by the "q=" tag in the DKIM-Signature header
|
||
field. Obviously, a public key need only be retrieved if the process
|
||
of extracting the signature information is completely successful.
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 46]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Details of key management and representation are described in
|
||
Section 3.6. The Verifier MUST validate the key record and MUST
|
||
ignore any public-key records that are malformed.
|
||
|
||
NOTE: The use of a wildcard TXT RR that covers a queried DKIM
|
||
domain name will produce a response to a DKIM query that is
|
||
unlikely to be a valid DKIM key record. This problem is not
|
||
specific to DKIM and applies to many other types of queries.
|
||
Client software that processes DNS responses needs to take this
|
||
problem into account.
|
||
|
||
When validating a message, a Verifier MUST perform the following
|
||
steps in a manner that is semantically the same as performing them in
|
||
the order indicated; in some cases, the implementation may
|
||
parallelize or reorder these steps, as long as the semantics remain
|
||
unchanged:
|
||
|
||
1. The Verifier retrieves the public key as described in Section 3.6
|
||
using the algorithm in the "q=" tag, the domain from the "d="
|
||
tag, and the selector from the "s=" tag.
|
||
|
||
2. If the query for the public key fails to respond, the Verifier
|
||
MAY seek a later verification attempt by returning TEMPFAIL (key
|
||
unavailable).
|
||
|
||
3. If the query for the public key fails because the corresponding
|
||
key record does not exist, the Verifier MUST immediately return
|
||
PERMFAIL (no key for signature).
|
||
|
||
4. If the query for the public key returns multiple key records, the
|
||
Verifier can choose one of the key records or may cycle through
|
||
the key records, performing the remainder of these steps on each
|
||
record at the discretion of the implementer. The order of the
|
||
key records is unspecified. If the Verifier chooses to cycle
|
||
through the key records, then the "return ..." wording in the
|
||
remainder of this section means "try the next key record, if any;
|
||
if none, return to try another signature in the usual way".
|
||
|
||
5. If the result returned from the query does not adhere to the
|
||
format defined in this specification, the Verifier MUST ignore
|
||
the key record and return PERMFAIL (key syntax error). Verifiers
|
||
are urged to validate the syntax of key records carefully to
|
||
avoid attempted attacks. In particular, the Verifier MUST ignore
|
||
keys with a version code ("v=" tag) that they do not implement.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 47]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
6. If the "h=" tag exists in the public-key record and the hash
|
||
algorithm implied by the "a=" tag in the DKIM-Signature header
|
||
field is not included in the contents of the "h=" tag, the
|
||
Verifier MUST ignore the key record and return PERMFAIL
|
||
(inappropriate hash algorithm).
|
||
|
||
7. If the public-key data (the "p=" tag) is empty, then this key has
|
||
been revoked and the Verifier MUST treat this as a failed
|
||
signature check and return PERMFAIL (key revoked). There is no
|
||
defined semantic difference between a key that has been revoked
|
||
and a key record that has been removed.
|
||
|
||
8. If the public-key data is not suitable for use with the algorithm
|
||
and key types defined by the "a=" and "k=" tags in the DKIM-
|
||
Signature header field, the Verifier MUST immediately return
|
||
PERMFAIL (inappropriate key algorithm).
|
||
|
||
6.1.3. Compute the Verification
|
||
|
||
Given a Signer and a public key, verifying a signature consists of
|
||
actions semantically equivalent to the following steps.
|
||
|
||
1. Based on the algorithm defined in the "c=" tag, the body length
|
||
specified in the "l=" tag, and the header field names in the "h="
|
||
tag, prepare a canonicalized version of the message as is
|
||
described in Section 3.7 (note that this canonicalized version
|
||
does not actually replace the original content). When matching
|
||
header field names in the "h=" tag against the actual message
|
||
header field, comparisons MUST be case-insensitive.
|
||
|
||
2. Based on the algorithm indicated in the "a=" tag, compute the
|
||
message hashes from the canonical copy as described in
|
||
Section 3.7.
|
||
|
||
3. Verify that the hash of the canonicalized message body computed
|
||
in the previous step matches the hash value conveyed in the "bh="
|
||
tag. If the hash does not match, the Verifier SHOULD ignore the
|
||
signature and return PERMFAIL (body hash did not verify).
|
||
|
||
4. Using the signature conveyed in the "b=" tag, verify the
|
||
signature against the header hash using the mechanism appropriate
|
||
for the public-key algorithm described in the "a=" tag. If the
|
||
signature does not validate, the Verifier SHOULD ignore the
|
||
signature and return PERMFAIL (signature did not verify).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 48]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
5. Otherwise, the signature has correctly verified.
|
||
|
||
INFORMATIVE IMPLEMENTER'S NOTE: Implementations might wish to
|
||
initiate the public-key query in parallel with calculating the
|
||
hash as the public key is not needed until the final decryption is
|
||
calculated. Implementations may also verify the signature on the
|
||
message header before validating that the message hash listed in
|
||
the "bh=" tag in the DKIM-Signature header field matches that of
|
||
the actual message body; however, if the body hash does not match,
|
||
the entire signature must be considered to have failed.
|
||
|
||
A body length specified in the "l=" tag of the signature limits the
|
||
number of bytes of the body passed to the verification algorithm.
|
||
All data beyond that limit is not validated by DKIM. Hence,
|
||
Verifiers might treat a message that contains bytes beyond the
|
||
indicated body length with suspicion and can choose to treat the
|
||
signature as if it were invalid (e.g., by returning PERMFAIL
|
||
(unsigned content)).
|
||
|
||
Should the algorithm reach this point, the verification has
|
||
succeeded, and DKIM reports SUCCESS for this signature.
|
||
|
||
6.2. Communicate Verification Results
|
||
|
||
Verifiers wishing to communicate the results of verification to other
|
||
parts of the mail system may do so in whatever manner they see fit.
|
||
For example, implementations might choose to add an email header
|
||
field to the message before passing it on. Any such header field
|
||
SHOULD be inserted before any existing DKIM-Signature or preexisting
|
||
authentication status header fields in the header field block. The
|
||
Authentication-Results: header field ([RFC5451]) MAY be used for this
|
||
purpose.
|
||
|
||
INFORMATIVE ADVICE to MUA filter writers: Patterns intended to
|
||
search for results header fields to visibly mark authenticated
|
||
mail for end users should verify that such a header field was
|
||
added by the appropriate verifying domain and that the verified
|
||
identity matches the author identity that will be displayed by the
|
||
MUA. In particular, MUA filters should not be influenced by bogus
|
||
results header fields added by attackers. To circumvent this
|
||
attack, Verifiers MAY wish to request deletion of existing results
|
||
header fields after verification and before arranging to add a new
|
||
header field.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 49]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
6.3. Interpret Results/Apply Local Policy
|
||
|
||
It is beyond the scope of this specification to describe what actions
|
||
an Identity Assessor can make, but mail carrying a validated SDID
|
||
presents an opportunity to an Identity Assessor that unauthenticated
|
||
email does not. Specifically, an authenticated email creates a
|
||
predictable identifier by which other decisions can reliably be
|
||
managed, such as trust and reputation. Conversely, unauthenticated
|
||
email lacks a reliable identifier that can be used to assign trust
|
||
and reputation. It is reasonable to treat unauthenticated email as
|
||
lacking any trust and having no positive reputation.
|
||
|
||
In general, modules that consume DKIM verification output SHOULD NOT
|
||
determine message acceptability based solely on a lack of any
|
||
signature or on an unverifiable signature; such rejection would cause
|
||
severe interoperability problems. If an MTA does wish to reject such
|
||
messages during an SMTP session (for example, when communicating with
|
||
a peer who, by prior agreement, agrees to only send signed messages),
|
||
and a signature is missing or does not verify, the handling MTA
|
||
SHOULD use a 550/5.7.x reply code.
|
||
|
||
Where the Verifier is integrated within the MTA and it is not
|
||
possible to fetch the public key, perhaps because the key server is
|
||
not available, a temporary failure message MAY be generated using a
|
||
451/4.7.5 reply code, such as:
|
||
|
||
451 4.7.5 Unable to verify signature - key server unavailable
|
||
|
||
Temporary failures such as inability to access the key server or
|
||
other external service are the only conditions that SHOULD use a 4xx
|
||
SMTP reply code. In particular, cryptographic signature verification
|
||
failures MUST NOT provoke 4xx SMTP replies.
|
||
|
||
Once the signature has been verified, that information MUST be
|
||
conveyed to the Identity Assessor (such as an explicit allow/
|
||
whitelist and reputation system) and/or to the end user. If the SDID
|
||
is not the same as the address in the From: header field, the mail
|
||
system SHOULD take pains to ensure that the actual SDID is clear to
|
||
the reader.
|
||
|
||
While the symptoms of a failed verification are obvious -- the
|
||
signature doesn't verify -- establishing the exact cause can be more
|
||
difficult. If a selector cannot be found, is that because the
|
||
selector has been removed, or was the value changed somehow in
|
||
transit? If the signature line is missing, is that because it was
|
||
never there, or was it removed by an overzealous filter? For
|
||
diagnostic purposes, the exact reason why the verification fails
|
||
SHOULD be made available and possibly recorded in the system logs.
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 50]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
If the email cannot be verified, then it SHOULD be treated the same
|
||
as all unverified email, regardless of whether or not it looks like
|
||
it was signed.
|
||
|
||
See Section 8.15 for additional discussion.
|
||
|
||
7. IANA Considerations
|
||
|
||
DKIM has registered namespaces with IANA. In all cases, new values
|
||
are assigned only for values that have been documented in a published
|
||
RFC that has IETF Consensus [RFC5226].
|
||
|
||
This memo updates these registries as described below. Of note is
|
||
the addition of a new "status" column. All registrations into these
|
||
namespaces MUST include the name being registered, the document in
|
||
which it was registered or updated, and an indication of its current
|
||
status, which MUST be one of "active" (in current use) or "historic"
|
||
(no longer in current use).
|
||
|
||
No new tags are defined in this specification compared to [RFC4871],
|
||
but one has been designated as "historic".
|
||
|
||
Also, the "Email Authentication Methods" registry is revised to refer
|
||
to this update.
|
||
|
||
7.1. Email Authentication Methods Registry
|
||
|
||
The "Email Authentication Methods" registry is updated to indicate
|
||
that "dkim" is defined in this memo.
|
||
|
||
7.2. DKIM-Signature Tag Specifications
|
||
|
||
A DKIM-Signature provides for a list of tag specifications. IANA has
|
||
established the "DKIM-Signature Tag Specifications" registry for tag
|
||
specifications that can be used in DKIM-Signature fields.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 51]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
+------+-----------------+--------+
|
||
| TYPE | REFERENCE | STATUS |
|
||
+------+-----------------+--------+
|
||
| v | (this document) | active |
|
||
| a | (this document) | active |
|
||
| b | (this document) | active |
|
||
| bh | (this document) | active |
|
||
| c | (this document) | active |
|
||
| d | (this document) | active |
|
||
| h | (this document) | active |
|
||
| i | (this document) | active |
|
||
| l | (this document) | active |
|
||
| q | (this document) | active |
|
||
| s | (this document) | active |
|
||
| t | (this document) | active |
|
||
| x | (this document) | active |
|
||
| z | (this document) | active |
|
||
+------+-----------------+--------+
|
||
|
||
Table 1: DKIM-Signature Tag Specifications Registry Updated Values
|
||
|
||
7.3. DKIM-Signature Query Method Registry
|
||
|
||
The "q=" tag-spec (specified in Section 3.5) provides for a list of
|
||
query methods.
|
||
|
||
IANA has established the "DKIM-Signature Query Method" registry for
|
||
mechanisms that can be used to retrieve the key that will permit
|
||
validation processing of a message signed using DKIM.
|
||
|
||
+------+--------+-----------------+--------+
|
||
| TYPE | OPTION | REFERENCE | STATUS |
|
||
+------+--------+-----------------+--------+
|
||
| dns | txt | (this document) | active |
|
||
+------+--------+-----------------+--------+
|
||
|
||
Table 2: DKIM-Signature Query Method Registry Updated Values
|
||
|
||
7.4. DKIM-Signature Canonicalization Registry
|
||
|
||
The "c=" tag-spec (specified in Section 3.5) provides for a specifier
|
||
for canonicalization algorithms for the header and body of the
|
||
message.
|
||
|
||
IANA has established the "DKIM-Signature Canonicalization Header"
|
||
Registry for algorithms for converting a message into a canonical
|
||
form before signing or verifying using DKIM.
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 52]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
+---------+-----------------+--------+
|
||
| TYPE | REFERENCE | STATUS |
|
||
+---------+-----------------+--------+
|
||
| simple | (this document) | active |
|
||
| relaxed | (this document) | active |
|
||
+---------+-----------------+--------+
|
||
|
||
Table 3: DKIM-Signature Canonicalization Header Registry Updated
|
||
Values
|
||
|
||
+---------+-----------------+--------+
|
||
| TYPE | REFERENCE | STATUS |
|
||
+---------+-----------------+--------+
|
||
| simple | (this document) | active |
|
||
| relaxed | (this document) | active |
|
||
+---------+-----------------+--------+
|
||
|
||
Table 4: DKIM-Signature Canonicalization Body Registry Updated Values
|
||
|
||
7.5. _domainkey DNS TXT Resource Record Tag Specifications
|
||
|
||
A _domainkey DNS TXT RR provides for a list of tag specifications.
|
||
IANA has established the DKIM "_domainkey DNS TXT Record Tag
|
||
Specifications" registry for tag specifications that can be used in
|
||
DNS TXT resource records.
|
||
|
||
+------+-----------------+----------+
|
||
| TYPE | REFERENCE | STATUS |
|
||
+------+-----------------+----------+
|
||
| v | (this document) | active |
|
||
| g | [RFC4871] | historic |
|
||
| h | (this document) | active |
|
||
| k | (this document) | active |
|
||
| n | (this document) | active |
|
||
| p | (this document) | active |
|
||
| s | (this document) | active |
|
||
| t | (this document) | active |
|
||
+------+-----------------+----------+
|
||
|
||
Table 5: _domainkey DNS TXT Record Tag Specifications Registry
|
||
Updated Values
|
||
|
||
7.6. DKIM Key Type Registry
|
||
|
||
The "k=" <key-k-tag> (specified in Section 3.6.1) and the "a=" <sig-
|
||
a-tag-k> (specified in Section 3.5) tags provide for a list of
|
||
mechanisms that can be used to decode a DKIM signature.
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 53]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
IANA has established the "DKIM Key Type" registry for such
|
||
mechanisms.
|
||
|
||
+------+-----------+--------+
|
||
| TYPE | REFERENCE | STATUS |
|
||
+------+-----------+--------+
|
||
| rsa | [RFC3447] | active |
|
||
+------+-----------+--------+
|
||
|
||
Table 6: DKIM Key Type Registry Updated Values
|
||
|
||
7.7. DKIM Hash Algorithms Registry
|
||
|
||
The "h=" <key-h-tag> (specified in Section 3.6.1) and the "a=" <sig-
|
||
a-tag-h> (specified in Section 3.5) tags provide for a list of
|
||
mechanisms that can be used to produce a digest of message data.
|
||
|
||
IANA has established the "DKIM Hash Algorithms" registry for such
|
||
mechanisms.
|
||
|
||
+--------+-------------------+--------+
|
||
| TYPE | REFERENCE | STATUS |
|
||
+--------+-------------------+--------+
|
||
| sha1 | [FIPS-180-3-2008] | active |
|
||
| sha256 | [FIPS-180-3-2008] | active |
|
||
+--------+-------------------+--------+
|
||
|
||
Table 7: DKIM Hash Algorithms Registry Updated Values
|
||
|
||
7.8. DKIM Service Types Registry
|
||
|
||
The "s=" <key-s-tag> tag (specified in Section 3.6.1) provides for a
|
||
list of service types to which this selector may apply.
|
||
|
||
IANA has established the "DKIM Service Types" registry for service
|
||
types.
|
||
|
||
+-------+-----------------+--------+
|
||
| TYPE | REFERENCE | STATUS |
|
||
+-------+-----------------+--------+
|
||
| email | (this document) | active |
|
||
| * | (this document) | active |
|
||
+-------+-----------------+--------+
|
||
|
||
Table 8: DKIM Service Types Registry Updated Values
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 54]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
7.9. DKIM Selector Flags Registry
|
||
|
||
The "t=" <key-t-tag> tag (specified in Section 3.6.1) provides for a
|
||
list of flags to modify interpretation of the selector.
|
||
|
||
IANA has established the "DKIM Selector Flags" registry for
|
||
additional flags.
|
||
|
||
+------+-----------------+--------+
|
||
| TYPE | REFERENCE | STATUS |
|
||
+------+-----------------+--------+
|
||
| y | (this document) | active |
|
||
| s | (this document) | active |
|
||
+------+-----------------+--------+
|
||
|
||
Table 9: DKIM Selector Flags Registry Updated Values
|
||
|
||
7.10. DKIM-Signature Header Field
|
||
|
||
IANA has added DKIM-Signature to the "Permanent Message Header Field
|
||
Names" registry (see [RFC3864]) for the "mail" protocol, using this
|
||
document as the reference.
|
||
|
||
8. Security Considerations
|
||
|
||
It has been observed that any introduced mechanism that attempts to
|
||
stem the flow of spam is subject to intensive attack. DKIM needs to
|
||
be carefully scrutinized to identify potential attack vectors and the
|
||
vulnerability to each. See also [RFC4686].
|
||
|
||
8.1. ASCII Art Attacks
|
||
|
||
The relaxed body canonicalization algorithm may enable certain types
|
||
of extremely crude "ASCII Art" attacks where a message may be
|
||
conveyed by adjusting the spacing between words. If this is a
|
||
concern, the "simple" body canonicalization algorithm should be used
|
||
instead.
|
||
|
||
8.2. Misuse of Body Length Limits ("l=" Tag)
|
||
|
||
Use of the "l=" tag might allow display of fraudulent content without
|
||
appropriate warning to end users. The "l=" tag is intended for
|
||
increasing signature robustness when sending to mailing lists that
|
||
both modify their content and do not sign their modified messages.
|
||
However, using the "l=" tag enables attacks in which an intermediary
|
||
with malicious intent can modify a message to include content that
|
||
solely benefits the attacker. It is possible for the appended
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 55]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
content to completely replace the original content in the end
|
||
recipient's eyes and to defeat duplicate message detection
|
||
algorithms.
|
||
|
||
An example of such an attack includes altering the MIME structure,
|
||
exploiting lax HTML parsing in the MUA, and defeating duplicate
|
||
message detection algorithms.
|
||
|
||
To avoid this attack, Signers should be extremely wary of using this
|
||
tag, and Assessors might wish to ignore signatures that use the tag.
|
||
|
||
8.3. Misappropriated Private Key
|
||
|
||
As with any other security application that uses private- or public-
|
||
key pairs, DKIM requires caution around the handling and protection
|
||
of keys. A compromised private key or access to one means an
|
||
intruder or malware can send mail signed by the domain that
|
||
advertises the matching public key.
|
||
|
||
Thus, private keys issued to users, rather than one used by an
|
||
ADministrative Management Domain (ADMD) itself, create the usual
|
||
problem of securing data stored on personal resources that can affect
|
||
the ADMD.
|
||
|
||
A more secure architecture involves sending messages through an
|
||
outgoing MTA that can authenticate the submitter using existing
|
||
techniques (e.g., SMTP Authentication), possibly validate the message
|
||
itself (e.g., verify that the header is legitimate and that the
|
||
content passes a spam content check), and sign the message using a
|
||
key appropriate for the submitter address. Such an MTA can also
|
||
apply controls on the volume of outgoing mail each user is permitted
|
||
to originate in order to further limit the ability of malware to
|
||
generate bulk email.
|
||
|
||
8.4. Key Server Denial-of-Service Attacks
|
||
|
||
Since the key servers are distributed (potentially separate for each
|
||
domain), the number of servers that would need to be attacked to
|
||
defeat this mechanism on an Internet-wide basis is very large.
|
||
Nevertheless, key servers for individual domains could be attacked,
|
||
impeding the verification of messages from that domain. This is not
|
||
significantly different from the ability of an attacker to deny
|
||
service to the mail exchangers for a given domain, although it
|
||
affects outgoing, not incoming, mail.
|
||
|
||
A variation on this attack involves a very large amount of mail being
|
||
sent using spoofed signatures from a given domain: the key servers
|
||
for that domain could be overwhelmed with requests in a denial-of-
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 56]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
service attack (see [RFC4732]). However, given the low overhead of
|
||
verification compared with handling of the email message itself, such
|
||
an attack would be difficult to mount.
|
||
|
||
8.5. Attacks against the DNS
|
||
|
||
Since the DNS is a required binding for key services, specific
|
||
attacks against the DNS must be considered.
|
||
|
||
While the DNS is currently insecure [RFC3833], these security
|
||
problems are the motivation behind DNS Security (DNSSEC) [RFC4033],
|
||
and all users of the DNS will reap the benefit of that work.
|
||
|
||
DKIM is only intended as a "sufficient" method of proving
|
||
authenticity. It is not intended to provide strong cryptographic
|
||
proof about authorship or contents. Other technologies such as
|
||
OpenPGP [RFC4880] and S/MIME [RFC5751] address those requirements.
|
||
|
||
A second security issue related to the DNS revolves around the
|
||
increased DNS traffic as a consequence of fetching selector-based
|
||
data as well as fetching signing domain policy. Widespread
|
||
deployment of DKIM will result in a significant increase in DNS
|
||
queries to the claimed signing domain. In the case of forgeries on a
|
||
large scale, DNS servers could see a substantial increase in queries.
|
||
|
||
A specific DNS security issue that should be considered by DKIM
|
||
Verifiers is the name chaining attack described in Section 2.3 of
|
||
[RFC3833]. A DKIM Verifier, while verifying a DKIM-Signature header
|
||
field, could be prompted to retrieve a key record of an attacker's
|
||
choosing. This threat can be minimized by ensuring that name
|
||
servers, including recursive name servers, used by the Verifier
|
||
enforce strict checking of "glue" and other additional information in
|
||
DNS responses and are therefore not vulnerable to this attack.
|
||
|
||
8.6. Replay/Spam Attacks
|
||
|
||
In this attack, a spammer sends a piece of spam through an MTA that
|
||
signs it, banking on the reputation of the signing domain (e.g., a
|
||
large popular mailbox provider) rather than its own, and then re-
|
||
sends that message to a large number of intended recipients. The
|
||
recipients observe the valid signature from the well-known domain,
|
||
elevating their trust in the message and increasing the likelihood of
|
||
delivery and presentation to the user.
|
||
|
||
Partial solutions to this problem involve the use of reputation
|
||
services to convey the fact that the specific email address is being
|
||
used for spam and that messages from that Signer are likely to be
|
||
spam. This requires a real-time detection mechanism in order to
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 57]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
react quickly enough. However, such measures might be prone to
|
||
abuse, if, for example, an attacker re-sent a large number of
|
||
messages received from a victim in order to make the victim appear to
|
||
be a spammer.
|
||
|
||
Large Verifiers might be able to detect unusually large volumes of
|
||
mails with the same signature in a short time period. Smaller
|
||
Verifiers can get substantially the same volume of information via
|
||
existing collaborative systems.
|
||
|
||
8.7. Limits on Revoking Keys
|
||
|
||
When a large domain detects undesirable behavior on the part of one
|
||
of its users, it might wish to revoke the key used to sign that
|
||
user's messages in order to disavow responsibility for messages that
|
||
have not yet been verified or that are the subject of a replay
|
||
attack. However, the ability of the domain to do so can be limited
|
||
if the same key, for scalability reasons, is used to sign messages
|
||
for many other users. Mechanisms for explicitly revoking keys on a
|
||
per-address basis have been proposed but require further study as to
|
||
their utility and the DNS load they represent.
|
||
|
||
8.8. Intentionally Malformed Key Records
|
||
|
||
It is possible for an attacker to publish key records in DNS that are
|
||
intentionally malformed, with the intent of causing a denial-of-
|
||
service attack on a non-robust Verifier implementation. The attacker
|
||
could then cause a Verifier to read the malformed key record by
|
||
sending a message to one of its users referencing the malformed
|
||
record in a (not necessarily valid) signature. Verifiers MUST
|
||
thoroughly verify all key records retrieved from the DNS and be
|
||
robust against intentionally as well as unintentionally malformed key
|
||
records.
|
||
|
||
8.9. Intentionally Malformed DKIM-Signature Header Fields
|
||
|
||
Verifiers MUST be prepared to receive messages with malformed DKIM-
|
||
Signature header fields and thoroughly verify the header field before
|
||
depending on any of its contents.
|
||
|
||
8.10. Information Leakage
|
||
|
||
An attacker could determine when a particular signature was verified
|
||
by using a per-message selector and then monitoring their DNS traffic
|
||
for the key lookup. This would act as the equivalent of a "web bug"
|
||
for verification time rather than the time the message was read.
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 58]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
8.11. Remote Timing Attacks
|
||
|
||
In some cases, it may be possible to extract private keys using a
|
||
remote timing attack [BONEH03]. Implementations should consider
|
||
obfuscating the timing to prevent such attacks.
|
||
|
||
8.12. Reordered Header Fields
|
||
|
||
Existing standards allow intermediate MTAs to reorder header fields.
|
||
If a Signer signs two or more header fields of the same name, this
|
||
can cause spurious verification errors on otherwise legitimate
|
||
messages. In particular, Signers that sign any existing DKIM-
|
||
Signature fields run the risk of having messages incorrectly fail to
|
||
verify.
|
||
|
||
8.13. RSA Attacks
|
||
|
||
An attacker could create a large RSA signing key with a small
|
||
exponent, thus requiring that the verification key have a large
|
||
exponent. This will force Verifiers to use considerable computing
|
||
resources to verify the signature. Verifiers might avoid this attack
|
||
by refusing to verify signatures that reference selectors with public
|
||
keys having unreasonable exponents.
|
||
|
||
In general, an attacker might try to overwhelm a Verifier by flooding
|
||
it with messages requiring verification. This is similar to other
|
||
MTA denial-of-service attacks and should be dealt with in a similar
|
||
fashion.
|
||
|
||
8.14. Inappropriate Signing by Parent Domains
|
||
|
||
The trust relationship described in Section 3.10 could conceivably be
|
||
used by a parent domain to sign messages with identities in a
|
||
subdomain not administratively related to the parent. For example,
|
||
the ".com" registry could create messages with signatures using an
|
||
"i=" value in the example.com domain. There is no general solution
|
||
to this problem, since the administrative cut could occur anywhere in
|
||
the domain name. For example, in the domain "example.podunk.ca.us",
|
||
there are three administrative cuts (podunk.ca.us, ca.us, and us),
|
||
any of which could create messages with an identity in the full
|
||
domain.
|
||
|
||
INFORMATIVE NOTE: This is considered an acceptable risk for the
|
||
same reason that it is acceptable for domain delegation. For
|
||
example, in the case above, any of the domains could potentially
|
||
simply delegate "example.podunk.ca.us" to a server of their choice
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 59]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
and completely replace all DNS-served information. Note that a
|
||
Verifier MAY ignore signatures that come from an unlikely domain
|
||
such as ".com", as discussed in Section 6.1.1.
|
||
|
||
8.15. Attacks Involving Extra Header Fields
|
||
|
||
Many email components, including MTAs, MSAs, MUAs, and filtering
|
||
modules, implement message format checks only loosely. This is done
|
||
out of years of industry pressure to be liberal in what is accepted
|
||
into the mail stream for the sake of reducing support costs;
|
||
improperly formed messages are often silently fixed in transit,
|
||
delivered unrepaired, or displayed inappropriately (e.g., by showing
|
||
only the first of multiple From: fields).
|
||
|
||
Agents that evaluate or apply DKIM output need to be aware that a
|
||
DKIM Signer can sign messages that are malformed (e.g., violate
|
||
[RFC5322], such as by having multiple instances of a field that is
|
||
only permitted once), that become malformed in transit, or that
|
||
contain header or body content that is not true or valid. Use of
|
||
DKIM on such messages might constitute an attack against a receiver,
|
||
especially where additional credence is given to a signed message
|
||
without adequate evaluation of the Signer.
|
||
|
||
These can represent serious attacks, but they have nothing to do with
|
||
DKIM; they are attacks on the recipient or on the wrongly identified
|
||
author.
|
||
|
||
Moreover, an agent would be incorrect to infer that all instances of
|
||
a header field are signed just because one is.
|
||
|
||
A genuine signature from the domain under attack can be obtained by
|
||
legitimate means, but extra header fields can then be added, either
|
||
by interception or by replay. In this scenario, DKIM can aid in
|
||
detecting addition of specific fields in transit. This is done by
|
||
having the Signer list the field name(s) in the "h=" tag an extra
|
||
time (e.g., "h=from:from:..." for a message with one From field), so
|
||
that addition of an instance of that field downstream will render the
|
||
signature unable to be verified. (See Section 3.5 for details.)
|
||
This, in essence, is an explicit indication that the Signer
|
||
repudiates responsibility for such a malformed message.
|
||
|
||
DKIM signs and validates the data it is told to and works correctly.
|
||
So in this case, DKIM has done its job of delivering a validated
|
||
domain (the "d=" value) and, given the semantics of a DKIM signature,
|
||
essentially the Signer has taken some responsibility for a
|
||
problematic message. It is up to the Identity Assessor or some other
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 60]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
subsequent agent to act on such messages as needed, such as degrading
|
||
the trust of the message (or, indeed, of the Signer), warning the
|
||
recipient, or even refusing delivery.
|
||
|
||
All components of the mail system that perform loose enforcement of
|
||
other mail standards will need to revisit that posture when
|
||
incorporating DKIM, especially when considering matters of potential
|
||
attacks such as those described.
|
||
|
||
9. References
|
||
|
||
9.1. Normative References
|
||
|
||
[FIPS-180-3-2008]
|
||
U.S. Department of Commerce, "Secure Hash Standard", FIPS
|
||
PUB 180-3, October 2008.
|
||
|
||
[ITU-X660-1997]
|
||
"Information Technology - ASN.1 encoding rules:
|
||
Specification of Basic Encoding Rules (BER), Canonical
|
||
Encoding Rules (CER) and Distinguished Encoding Rules
|
||
(DER)", 1997.
|
||
|
||
[RFC1034] Mockapetris, P., "Domain names - concepts and facilities",
|
||
STD 13, RFC 1034, November 1987.
|
||
|
||
[RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
|
||
Extensions (MIME) Part One: Format of Internet Message
|
||
Bodies", RFC 2045, November 1996.
|
||
|
||
[RFC2049] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
|
||
Extensions (MIME) Part Five: Conformance Criteria and
|
||
Examples", RFC 2049, November 1996.
|
||
|
||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
|
||
Requirement Levels", BCP 14, RFC 2119, March 1997.
|
||
|
||
[RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography
|
||
Standards (PKCS) #1: RSA Cryptography Specifications
|
||
Version 2.1", RFC 3447, February 2003.
|
||
|
||
[RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax
|
||
Specifications: ABNF", STD 68, RFC 5234, January 2008.
|
||
|
||
[RFC5321] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321,
|
||
October 2008.
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 61]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
[RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322,
|
||
October 2008.
|
||
|
||
[RFC5598] Crocker, D., "Internet Mail Architecture", RFC 5598,
|
||
July 2009.
|
||
|
||
[RFC5890] Klensin, J., "Internationalized Domain Names for
|
||
Applications (IDNA): Definitions and Document Framework",
|
||
RFC 5890, August 2010.
|
||
|
||
9.2. Informative References
|
||
|
||
[BONEH03] "Remote Timing Attacks are Practical", Proceedings 12th
|
||
USENIX Security Symposium, 2003.
|
||
|
||
[RFC2047] Moore, K., "MIME (Multipurpose Internet Mail Extensions)
|
||
Part Three: Message Header Extensions for Non-ASCII Text",
|
||
RFC 2047, November 1996.
|
||
|
||
[RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
|
||
10646", STD 63, RFC 3629, November 2003.
|
||
|
||
[RFC3766] Orman, H. and P. Hoffman, "Determining Strengths For
|
||
Public Keys Used For Exchanging Symmetric Keys", BCP 86,
|
||
RFC 3766, April 2004.
|
||
|
||
[RFC3833] Atkins, D. and R. Austein, "Threat Analysis of the Domain
|
||
Name System (DNS)", RFC 3833, August 2004.
|
||
|
||
[RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
|
||
Procedures for Message Header Fields", BCP 90, RFC 3864,
|
||
September 2004.
|
||
|
||
[RFC4033] Arends, R., Austein, R., Larson, M., Massey, D., and S.
|
||
Rose, "DNS Security Introduction and Requirements",
|
||
RFC 4033, March 2005.
|
||
|
||
[RFC4409] Gellens, R. and J. Klensin, "Message Submission for Mail",
|
||
RFC 4409, April 2006.
|
||
|
||
[RFC4686] Fenton, J., "Analysis of Threats Motivating DomainKeys
|
||
Identified Mail (DKIM)", RFC 4686, September 2006.
|
||
|
||
[RFC4732] Handley, M., Rescorla, E., and IAB, "Internet Denial-of-
|
||
Service Considerations", RFC 4732, December 2006.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 62]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
[RFC4870] Delany, M., "Domain-Based Email Authentication Using
|
||
Public Keys Advertised in the DNS (DomainKeys)", RFC 4870,
|
||
May 2007.
|
||
|
||
[RFC4871] Allman, E., Callas, J., Delany, M., Libbey, M., Fenton,
|
||
J., and M. Thomas, "DomainKeys Identified Mail (DKIM)
|
||
Signatures", RFC 4871, May 2007.
|
||
|
||
[RFC4880] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R.
|
||
Thayer, "OpenPGP Message Format", RFC 4880, November 2007.
|
||
|
||
[RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an
|
||
IANA Considerations Section in RFCs", BCP 26, RFC 5226,
|
||
May 2008.
|
||
|
||
[RFC5451] Kucherawy, M., "Message Header Field for Indicating
|
||
Message Authentication Status", RFC 5451, April 2009.
|
||
|
||
[RFC5585] Hansen, T., Crocker, D., and P. Hallam-Baker, "DomainKeys
|
||
Identified Mail (DKIM) Service Overview", RFC 5585,
|
||
July 2009.
|
||
|
||
[RFC5672] Crocker, D., "RFC 4871 DomainKeys Identified Mail (DKIM)
|
||
Signatures -- Update", RFC 5672, August 2009.
|
||
|
||
[RFC5751] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet
|
||
Mail Extensions (S/MIME) Version 3.2 Message
|
||
Specification", RFC 5751, January 2010.
|
||
|
||
[RFC5863] Hansen, T., Siegel, E., Hallam-Baker, P., and D. Crocker,
|
||
"DomainKeys Identified Mail (DKIM) Development,
|
||
Deployment, and Operations", RFC 5863, May 2010.
|
||
|
||
[RFC6377] Kucherawy, M., "DomainKeys Identified Mail (DKIM) and
|
||
Mailing Lists", RFC 6377, September 2011.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 63]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Appendix A. Example of Use (INFORMATIVE)
|
||
|
||
This section shows the complete flow of an email from submission to
|
||
final delivery, demonstrating how the various components fit
|
||
together. The key used in this example is shown in Appendix C.
|
||
|
||
A.1. The User Composes an Email
|
||
|
||
From: Joe SixPack <joe@football.example.com>
|
||
To: Suzie Q <suzie@shopping.example.net>
|
||
Subject: Is dinner ready?
|
||
Date: Fri, 11 Jul 2003 21:00:37 -0700 (PDT)
|
||
Message-ID: <20030712040037.46341.5F8J@football.example.com>
|
||
|
||
Hi.
|
||
|
||
We lost the game. Are you hungry yet?
|
||
|
||
Joe.
|
||
|
||
Figure 1: The User Composes an Email
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 64]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
A.2. The Email is Signed
|
||
|
||
This email is signed by the example.com outbound email server and now
|
||
looks like this:
|
||
|
||
DKIM-Signature: v=1; a=rsa-sha256; s=brisbane; d=example.com;
|
||
c=simple/simple; q=dns/txt; i=joe@football.example.com;
|
||
h=Received : From : To : Subject : Date : Message-ID;
|
||
bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;
|
||
b=AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB
|
||
4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHut
|
||
KVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV
|
||
4bmp/YzhwvcubU4=;
|
||
Received: from client1.football.example.com [192.0.2.1]
|
||
by submitserver.example.com with SUBMISSION;
|
||
Fri, 11 Jul 2003 21:01:54 -0700 (PDT)
|
||
From: Joe SixPack <joe@football.example.com>
|
||
To: Suzie Q <suzie@shopping.example.net>
|
||
Subject: Is dinner ready?
|
||
Date: Fri, 11 Jul 2003 21:00:37 -0700 (PDT)
|
||
Message-ID: <20030712040037.46341.5F8J@football.example.com>
|
||
|
||
Hi.
|
||
|
||
We lost the game. Are you hungry yet?
|
||
|
||
Joe.
|
||
|
||
Figure 2: The Email is Signed
|
||
|
||
The signing email server requires access to the private key
|
||
associated with the "brisbane" selector to generate this signature.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 65]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
A.3. The Email Signature is Verified
|
||
|
||
The signature is normally verified by an inbound SMTP server or
|
||
possibly the final delivery agent. However, intervening MTAs can
|
||
also perform this verification if they choose to do so. The
|
||
verification process uses the domain "example.com" extracted from the
|
||
"d=" tag and the selector "brisbane" from the "s=" tag in the DKIM-
|
||
Signature header field to form the DNS DKIM query for:
|
||
brisbane._domainkey.example.com
|
||
|
||
Signature verification starts with the physically last Received
|
||
header field, the From header field, and so forth, in the order
|
||
listed in the "h=" tag. Verification follows with a single CRLF
|
||
followed by the body (starting with "Hi."). The email is canonically
|
||
prepared for verifying with the "simple" method. The result of the
|
||
query and subsequent verification of the signature is stored (in this
|
||
example) in the X-Authentication-Results header field line. After
|
||
successful verification, the email looks like this:
|
||
|
||
X-Authentication-Results: shopping.example.net
|
||
header.from=joe@football.example.com; dkim=pass
|
||
Received: from mout23.football.example.com (192.168.1.1)
|
||
by shopping.example.net with SMTP;
|
||
Fri, 11 Jul 2003 21:01:59 -0700 (PDT)
|
||
DKIM-Signature: v=1; a=rsa-sha256; s=brisbane; d=example.com;
|
||
c=simple/simple; q=dns/txt; i=joe@football.example.com;
|
||
h=Received : From : To : Subject : Date : Message-ID;
|
||
bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;
|
||
b=AuUoFEfDxTDkHlLXSZEpZj79LICEps6eda7W3deTVFOk4yAUoqOB
|
||
4nujc7YopdG5dWLSdNg6xNAZpOPr+kHxt1IrE+NahM6L/LbvaHut
|
||
KVdkLLkpVaVVQPzeRDI009SO2Il5Lu7rDNH6mZckBdrIx0orEtZV
|
||
4bmp/YzhwvcubU4=;
|
||
Received: from client1.football.example.com [192.0.2.1]
|
||
by submitserver.example.com with SUBMISSION;
|
||
Fri, 11 Jul 2003 21:01:54 -0700 (PDT)
|
||
From: Joe SixPack <joe@football.example.com>
|
||
To: Suzie Q <suzie@shopping.example.net>
|
||
Subject: Is dinner ready?
|
||
Date: Fri, 11 Jul 2003 21:00:37 -0700 (PDT)
|
||
Message-ID: <20030712040037.46341.5F8J@football.example.com>
|
||
|
||
Hi.
|
||
|
||
We lost the game. Are you hungry yet?
|
||
|
||
Joe.
|
||
|
||
Figure 3: Successful Verification
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 66]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Appendix B. Usage Examples (INFORMATIVE)
|
||
|
||
DKIM signing and validating can be used in different ways, for
|
||
different operational scenarios. This Appendix discusses some common
|
||
examples.
|
||
|
||
NOTE: Descriptions in this Appendix are for informational purposes
|
||
only. They describe various ways that DKIM can be used, given
|
||
particular constraints and needs. In no case are these examples
|
||
intended to be taken as providing explanation or guidance
|
||
concerning DKIM specification details when creating an
|
||
implementation.
|
||
|
||
B.1. Alternate Submission Scenarios
|
||
|
||
In the most simple scenario, a user's MUA, MSA, and Internet
|
||
(boundary) MTA are all within the same administrative environment,
|
||
using the same domain name. Therefore, all of the components
|
||
involved in submission and initial transfer are related. However, it
|
||
is common for two or more of the components to be under independent
|
||
administrative control. This creates challenges for choosing and
|
||
administering the domain name to use for signing and for its
|
||
relationship to common email identity header fields.
|
||
|
||
B.1.1. Delegated Business Functions
|
||
|
||
Some organizations assign specific business functions to discrete
|
||
groups, inside or outside the organization. The goal, then, is to
|
||
authorize that group to sign some mail but to constrain what
|
||
signatures they can generate. DKIM selectors (the "s=" signature
|
||
tag) facilitate this kind of restricted authorization. Examples of
|
||
these outsourced business functions are legitimate email marketing
|
||
providers and corporate benefits providers.
|
||
|
||
Here, the delegated group needs to be able to send messages that are
|
||
signed, using the email domain of the client company. At the same
|
||
time, the client often is reluctant to register a key for the
|
||
provider that grants the ability to send messages for arbitrary
|
||
addresses in the domain.
|
||
|
||
There are multiple ways to administer these usage scenarios. In one
|
||
case, the client organization provides all of the public query
|
||
service (for example, DNS) administration, and in another, it uses
|
||
DNS delegation to enable all ongoing administration of the DKIM key
|
||
record by the delegated group.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 67]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
If the client organization retains responsibility for all of the DNS
|
||
administration, the outsourcing company can generate a key pair,
|
||
supplying the public key to the client company, which then registers
|
||
it in the query service using a unique selector. The client company
|
||
retains control over the use of the delegated key because it retains
|
||
the ability to revoke the key at any time.
|
||
|
||
If the client wants the delegated group to do the DNS administration,
|
||
it can have the domain name that is specified with the selector point
|
||
to the provider's DNS server. The provider then creates and
|
||
maintains all of the DKIM signature information for that selector.
|
||
Hence, the client cannot provide constraints on the local-part of
|
||
addresses that get signed, but it can revoke the provider's signing
|
||
rights by removing the DNS delegation record.
|
||
|
||
B.1.2. PDAs and Similar Devices
|
||
|
||
PDAs demonstrate the need for using multiple keys per domain.
|
||
Suppose that John Doe wants to be able to send messages using his
|
||
corporate email address, jdoe@example.com, and his email device does
|
||
not have the ability to make a Virtual Private Network (VPN)
|
||
connection to the corporate network, either because the device is
|
||
limited or because there are restrictions enforced by his Internet
|
||
access provider. If the device is equipped with a private key
|
||
registered for jdoe@example.com by the administrator of the
|
||
example.com domain and appropriate software to sign messages, John
|
||
could sign the message on the device itself before transmission
|
||
through the outgoing network of the access service provider.
|
||
|
||
B.1.3. Roaming Users
|
||
|
||
Roaming users often find themselves in circumstances where it is
|
||
convenient or necessary to use an SMTP server other than their home
|
||
server; examples are conferences and many hotels. In such
|
||
circumstances, a signature that is added by the submission service
|
||
will use an identity that is different from the user's home system.
|
||
|
||
Ideally, roaming users would connect back to their home server using
|
||
either a VPN or a SUBMISSION server running with SMTP AUTHentication
|
||
on port 587. If the signing can be performed on the roaming user's
|
||
laptop, then they can sign before submission, although the risk of
|
||
further modification is high. If neither of these are possible,
|
||
these roaming users will not be able to send mail signed using their
|
||
own domain key.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 68]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
B.1.4. Independent (Kiosk) Message Submission
|
||
|
||
Stand-alone services, such as walk-up kiosks and web-based
|
||
information services, have no enduring email service relationship
|
||
with the user, but users occasionally request that mail be sent on
|
||
their behalf. For example, a website providing news often allows the
|
||
reader to forward a copy of the article to a friend. This is
|
||
typically done using the reader's own email address, to indicate who
|
||
the author is. This is sometimes referred to as the "Evite" problem,
|
||
named after the website of the same name that allows a user to send
|
||
invitations to friends.
|
||
|
||
A common way this is handled is to continue to put the reader's email
|
||
address in the From header field of the message but put an address
|
||
owned by the email posting site into the Sender header field. The
|
||
posting site can then sign the message, using the domain that is in
|
||
the Sender field. This provides useful information to the receiving
|
||
email site, which is able to correlate the signing domain with the
|
||
initial submission email role.
|
||
|
||
Receiving sites often wish to provide their end users with
|
||
information about mail that is mediated in this fashion. Although
|
||
the real efficacy of different approaches is a subject for human
|
||
factors usability research, one technique that is used is for the
|
||
verifying system to rewrite the From header field to indicate the
|
||
address that was verified, for example: From: John Doe via
|
||
news@news-site.example <jdoe@example.com>. (Note that such rewriting
|
||
will break a signature, unless it is done after the verification pass
|
||
is complete.)
|
||
|
||
B.2. Alternate Delivery Scenarios
|
||
|
||
Email is often received at a mailbox that has an address different
|
||
from the one used during initial submission. In these cases, an
|
||
intermediary mechanism operates at the address originally used, and
|
||
it then passes the message on to the final destination. This
|
||
mediation process presents some challenges for DKIM signatures.
|
||
|
||
B.2.1. Affinity Addresses
|
||
|
||
"Affinity addresses" allow a user to have an email address that
|
||
remains stable, even as the user moves among different email
|
||
providers. They are typically associated with college alumni
|
||
associations, professional organizations, and recreational
|
||
organizations with which they expect to have a long-term
|
||
relationship. These domains usually provide forwarding of incoming
|
||
email, and they often have an associated Web application that
|
||
authenticates the user and allows the forwarding address to be
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 69]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
changed. However, these services usually depend on users sending
|
||
outgoing messages through their own service provider's MTAs. Hence,
|
||
mail that is signed with the domain of the affinity address is not
|
||
signed by an entity that is administered by the organization owning
|
||
that domain.
|
||
|
||
With DKIM, affinity domains could use the Web application to allow
|
||
users to register per-user keys to be used to sign messages on behalf
|
||
of their affinity address. The user would take away the secret half
|
||
of the key pair for signing, and the affinity domain would publish
|
||
the public half in DNS for access by Verifiers.
|
||
|
||
This is another application that takes advantage of user-level
|
||
keying, and domains used for affinity addresses would typically have
|
||
a very large number of user-level keys. Alternatively, the affinity
|
||
domain could handle outgoing mail, operating a mail submission agent
|
||
that authenticates users before accepting and signing messages for
|
||
them. This is, of course, dependent on the user's service provider
|
||
not blocking the relevant TCP ports used for mail submission.
|
||
|
||
B.2.2. Simple Address Aliasing (.forward)
|
||
|
||
In some cases, a recipient is allowed to configure an email address
|
||
to cause automatic redirection of email messages from the original
|
||
address to another, such as through the use of a Unix .forward file.
|
||
In this case, messages are typically redirected by the mail handling
|
||
service of the recipient's domain, without modification, except for
|
||
the addition of a Received header field to the message and a change
|
||
in the envelope recipient address. In this case, the recipient at
|
||
the final address' mailbox is likely to be able to verify the
|
||
original signature since the signed content has not changed, and DKIM
|
||
is able to validate the message signature.
|
||
|
||
B.2.3. Mailing Lists and Re-Posters
|
||
|
||
There is a wide range of behaviors in services that take delivery of
|
||
a message and then resubmit it. A primary example is with mailing
|
||
lists (collectively called "forwarders" below), ranging from those
|
||
that make no modification to the message itself, other than to add a
|
||
Received header field and change the envelope information, to those
|
||
that add header fields, change the Subject header field, add content
|
||
to the body (typically at the end), or reformat the body in some
|
||
manner. The simple ones produce messages that are quite similar to
|
||
the automated alias services. More elaborate systems essentially
|
||
create a new message.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 70]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
A Forwarder that does not modify the body or signed header fields of
|
||
a message is likely to maintain the validity of the existing
|
||
signature. It also could choose to add its own signature to the
|
||
message.
|
||
|
||
Forwarders that modify a message in a way that could make an existing
|
||
signature invalid are particularly good candidates for adding their
|
||
own signatures (e.g., mailing-list-name@example.net). Since
|
||
(re-)signing is taking responsibility for the content of the message,
|
||
these signing forwarders are likely to be selective and forward or
|
||
re-sign a message only if it is received with a valid signature or if
|
||
they have some other basis for knowing that the message is not
|
||
spoofed.
|
||
|
||
A common practice among systems that are primarily redistributors of
|
||
mail is to add a Sender header field to the message to identify the
|
||
address being used to sign the message. This practice will remove
|
||
any preexisting Sender header field as required by [RFC5322]. The
|
||
forwarder applies a new DKIM-Signature header field with the
|
||
signature, public key, and related information of the forwarder.
|
||
|
||
See [RFC6377] for additional related topics and discussion.
|
||
|
||
Appendix C. Creating a Public Key (INFORMATIVE)
|
||
|
||
The default signature is an RSA-signed SHA-256 digest of the complete
|
||
email. For ease of explanation, the openssl command is used to
|
||
describe the mechanism by which keys and signatures are managed. One
|
||
way to generate a 1024-bit, unencrypted private key suitable for DKIM
|
||
is to use openssl like this:
|
||
|
||
$ openssl genrsa -out rsa.private 1024
|
||
|
||
For increased security, the "-passin" parameter can also be added to
|
||
encrypt the private key. Use of this parameter will require entering
|
||
a password for several of the following steps. Servers may prefer to
|
||
use hardware cryptographic support.
|
||
|
||
The "genrsa" step results in the file rsa.private containing the key
|
||
information similar to this:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 71]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
-----BEGIN RSA PRIVATE KEY-----
|
||
MIICXwIBAAKBgQDwIRP/UC3SBsEmGqZ9ZJW3/DkMoGeLnQg1fWn7/zYtIxN2SnFC
|
||
jxOCKG9v3b4jYfcTNh5ijSsq631uBItLa7od+v/RtdC2UzJ1lWT947qR+Rcac2gb
|
||
to/NMqJ0fzfVjH4OuKhitdY9tf6mcwGjaNBcWToIMmPSPDdQPNUYckcQ2QIDAQAB
|
||
AoGBALmn+XwWk7akvkUlqb+dOxyLB9i5VBVfje89Teolwc9YJT36BGN/l4e0l6QX
|
||
/1//6DWUTB3KI6wFcm7TWJcxbS0tcKZX7FsJvUz1SbQnkS54DJck1EZO/BLa5ckJ
|
||
gAYIaqlA9C0ZwM6i58lLlPadX/rtHb7pWzeNcZHjKrjM461ZAkEA+itss2nRlmyO
|
||
n1/5yDyCluST4dQfO8kAB3toSEVc7DeFeDhnC1mZdjASZNvdHS4gbLIA1hUGEF9m
|
||
3hKsGUMMPwJBAPW5v/U+AWTADFCS22t72NUurgzeAbzb1HWMqO4y4+9Hpjk5wvL/
|
||
eVYizyuce3/fGke7aRYw/ADKygMJdW8H/OcCQQDz5OQb4j2QDpPZc0Nc4QlbvMsj
|
||
7p7otWRO5xRa6SzXqqV3+F0VpqvDmshEBkoCydaYwc2o6WQ5EBmExeV8124XAkEA
|
||
qZzGsIxVP+sEVRWZmW6KNFSdVUpk3qzK0Tz/WjQMe5z0UunY9Ax9/4PVhp/j61bf
|
||
eAYXunajbBSOLlx4D+TunwJBANkPI5S9iylsbLs6NkaMHV6k5ioHBBmgCak95JGX
|
||
GMot/L2x0IYyMLAz6oLWh2hm7zwtb0CgOrPo1ke44hFYnfc=
|
||
-----END RSA PRIVATE KEY-----
|
||
|
||
To extract the public-key component from the private key, use openssl
|
||
like this:
|
||
|
||
$ openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM
|
||
|
||
This results in the file rsa.public containing the key information
|
||
similar to this:
|
||
|
||
-----BEGIN PUBLIC KEY-----
|
||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDwIRP/UC3SBsEmGqZ9ZJW3/DkM
|
||
oGeLnQg1fWn7/zYtIxN2SnFCjxOCKG9v3b4jYfcTNh5ijSsq631uBItLa7od+v/R
|
||
tdC2UzJ1lWT947qR+Rcac2gbto/NMqJ0fzfVjH4OuKhitdY9tf6mcwGjaNBcWToI
|
||
MmPSPDdQPNUYckcQ2QIDAQAB
|
||
-----END PUBLIC KEY-----
|
||
|
||
This public-key data (without the BEGIN and END tags) is placed in
|
||
the DNS:
|
||
|
||
$ORIGIN _domainkey.example.org.
|
||
brisbane IN TXT ("v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQ"
|
||
"KBgQDwIRP/UC3SBsEmGqZ9ZJW3/DkMoGeLnQg1fWn7/zYt"
|
||
"IxN2SnFCjxOCKG9v3b4jYfcTNh5ijSsq631uBItLa7od+v"
|
||
"/RtdC2UzJ1lWT947qR+Rcac2gbto/NMqJ0fzfVjH4OuKhi"
|
||
"tdY9tf6mcwGjaNBcWToIMmPSPDdQPNUYckcQ2QIDAQAB")
|
||
|
||
C.1. Compatibility with DomainKeys Key Records
|
||
|
||
DKIM key records were designed to be backward compatible in many
|
||
cases with key records used by DomainKeys [RFC4870] (sometimes
|
||
referred to as "selector records" in the DomainKeys context). One
|
||
area of incompatibility warrants particular attention. The "g=" tag
|
||
value may be used in DomainKeys and [RFC4871] key records to provide
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 72]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
finer granularity of the validity of the key record to a specific
|
||
local-part. A null "g=" value in DomainKeys is valid for all
|
||
addresses in the domain. This differs from the usage in the original
|
||
DKIM specification ([RFC4871]), where a null "g=" value is not valid
|
||
for any address. In particular, see the example public-key record in
|
||
Section 3.2.3 of [RFC4870].
|
||
|
||
C.2. RFC 4871 Compatibility
|
||
|
||
Although the "g=" tag has been deprecated in this version of the DKIM
|
||
specification (and thus MUST now be ignored), Signers are advised not
|
||
to include the "g=" tag in key records because some [RFC4871]-
|
||
compliant Verifiers will be in use for a considerable period to come.
|
||
|
||
Appendix D. MUA Considerations (INFORMATIVE)
|
||
|
||
When a DKIM signature is verified, the processing system sometimes
|
||
makes the result available to the recipient user's MUA. How to
|
||
present this information to users in a way that helps them is a
|
||
matter of continuing human factors usability research. The tendency
|
||
is to have the MUA highlight the SDID, in an attempt to show the user
|
||
the identity that is claiming responsibility for the message. An MUA
|
||
might do this with visual cues such as graphics, might include the
|
||
address in an alternate view, or might even rewrite the original From
|
||
address using the verified information. Some MUAs might indicate
|
||
which header fields were protected by the validated DKIM signature.
|
||
This could be done with a positive indication on the signed header
|
||
fields, with a negative indication on the unsigned header fields, by
|
||
visually hiding the unsigned header fields, or some combination of
|
||
these. If an MUA uses visual indications for signed header fields,
|
||
the MUA probably needs to be careful not to display unsigned header
|
||
fields in a way that might be construed by the end user as having
|
||
been signed. If the message has an "l=" tag whose value does not
|
||
extend to the end of the message, the MUA might also hide or mark the
|
||
portion of the message body that was not signed.
|
||
|
||
The aforementioned information is not intended to be exhaustive. The
|
||
MUA can choose to highlight, accentuate, hide, or otherwise display
|
||
any other information that may, in the opinion of the MUA author, be
|
||
deemed important to the end user.
|
||
|
||
Appendix E. Changes since RFC 4871
|
||
|
||
o Abstract and introduction refined based on accumulated experience.
|
||
|
||
o Various references updated.
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 73]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
o Several errata resolved (see http://www.rfc-editor.org/):
|
||
|
||
* 1376 applied
|
||
|
||
* 1377 applied
|
||
|
||
* 1378 applied
|
||
|
||
* 1379 applied
|
||
|
||
* 1380 applied
|
||
|
||
* 1381 applied
|
||
|
||
* 1382 applied
|
||
|
||
* 1383 discarded (no longer applies)
|
||
|
||
* 1384 applied
|
||
|
||
* 1386 applied
|
||
|
||
* 1461 applied
|
||
|
||
* 1487 applied
|
||
|
||
* 1532 applied
|
||
|
||
* 1596 applied
|
||
|
||
o Introductory section enumerating relevant architectural documents
|
||
added.
|
||
|
||
o Introductory section briefly discussing the matter of data
|
||
integrity added.
|
||
|
||
o Allowed tolerance of some clock drift.
|
||
|
||
o Dropped "g=" tag from key records. The implementation report
|
||
indicates that it is not in use.
|
||
|
||
o Removed errant note about wildcards in the DNS.
|
||
|
||
o Removed SMTP-specific advice in most places.
|
||
|
||
o Reduced (non-normative) recommended signature content list, and
|
||
reworked the text in that section.
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 74]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
o Clarified signature generation algorithm by rewriting its pseudo-
|
||
code.
|
||
|
||
o Numerous terminology subsections added, imported from [RFC5672].
|
||
Also, began using these terms throughout the document (e.g., SDID,
|
||
AUID).
|
||
|
||
o Sections added that specify input and output requirements. Input
|
||
requirements address a security concern raised by the working
|
||
group (see also new sections in Security Considerations). Output
|
||
requirements are imported from [RFC5672].
|
||
|
||
o Appendix subsection added discussing compatibility with DomainKeys
|
||
([RFC4870]) records.
|
||
|
||
o Referred to [RFC5451] as an example method of communicating the
|
||
results of DKIM verification.
|
||
|
||
o Removed advice about possible uses of the "l=" signature tag.
|
||
|
||
o IANA registry updated.
|
||
|
||
o Added two new Security Considerations sections talking about
|
||
malformed message attacks.
|
||
|
||
o Various copy editing.
|
||
|
||
Appendix F. Acknowledgments
|
||
|
||
The previous IETF version of DKIM [RFC4871] was edited by Eric
|
||
Allman, Jon Callas, Mark Delany, Miles Libbey, Jim Fenton, and
|
||
Michael Thomas.
|
||
|
||
That specification was the result of an extended collaborative
|
||
effort, including participation by Russ Allbery, Edwin Aoki, Claus
|
||
Assmann, Steve Atkins, Rob Austein, Fred Baker, Mark Baugher, Steve
|
||
Bellovin, Nathaniel Borenstein, Dave Crocker, Michael Cudahy, Dennis
|
||
Dayman, Jutta Degener, Frank Ellermann, Patrik Faeltstroem, Mark
|
||
Fanto, Stephen Farrell, Duncan Findlay, Elliot Gillum, Olafur
|
||
Gudmundsson, Phillip Hallam-Baker, Tony Hansen, Sam Hartman, Arvel
|
||
Hathcock, Amir Herzberg, Paul Hoffman, Russ Housley, Craig Hughes,
|
||
Cullen Jennings, Don Johnsen, Harry Katz, Murray S. Kucherawy, Barry
|
||
Leiba, John Levine, Charles Lindsey, Simon Longsdale, David Margrave,
|
||
Justin Mason, David Mayne, Thierry Moreau, Steve Murphy, Russell
|
||
Nelson, Dave Oran, Doug Otis, Shamim Pirzada, Juan Altmayer Pizzorno,
|
||
Sanjay Pol, Blake Ramsdell, Christian Renaud, Scott Renfro, Neil
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 75]
|
||
|
||
RFC 6376 DKIM Signatures September 2011
|
||
|
||
|
||
Rerup, Eric Rescorla, Dave Rossetti, Hector Santos, Jim Schaad, the
|
||
Spamhaus.org team, Malte S. Stretz, Robert Sanders, Rand Wacker, Sam
|
||
Weiler, and Dan Wing.
|
||
|
||
The earlier DomainKeys was a primary source from which DKIM was
|
||
derived. Further information about DomainKeys is at [RFC4870].
|
||
|
||
This revision received contributions from Steve Atkins, Mark Delany,
|
||
J.D. Falk, Jim Fenton, Michael Hammer, Barry Leiba, John Levine,
|
||
Charles Lindsey, Jeff Macdonald, Franck Martin, Brett McDowell, Doug
|
||
Otis, Bill Oxley, Hector Santos, Rolf Sonneveld, Michael Thomas, and
|
||
Alessandro Vesely.
|
||
|
||
Authors' Addresses
|
||
|
||
Dave Crocker (editor)
|
||
Brandenburg InternetWorking
|
||
675 Spruce Dr.
|
||
Sunnyvale, CA 94086
|
||
USA
|
||
|
||
Phone: +1.408.246.8253
|
||
EMail: dcrocker@bbiw.net
|
||
URI: http://bbiw.net
|
||
|
||
|
||
Tony Hansen (editor)
|
||
AT&T Laboratories
|
||
200 Laurel Ave. South
|
||
Middletown, NJ 07748
|
||
USA
|
||
|
||
EMail: tony+dkimsig@maillennium.att.com
|
||
|
||
|
||
Murray S. Kucherawy (editor)
|
||
Cloudmark
|
||
128 King St., 2nd Floor
|
||
San Francisco, CA 94107
|
||
USA
|
||
|
||
EMail: msk@cloudmark.com
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Crocker, et al. Standards Track [Page 76]
|
||
|