9. Formale Syntax (Formal Syntax)
RFC 3501 IMAPv4 March 2003
-
Beispiel einer IMAP4rev1-Verbindung (Sample IMAP4rev1 connection)Das Folgende ist eine Abschrift (transcript) einer IMAP4rev1-Verbindung. Eine lange Zeile in diesem Beispiel ist zur besseren Lesbarkeit umbrochen.
S: * OK IMAP4rev1 Service Ready
C: a001 login mrc secret
S: a001 OK LOGIN completed
C: a002 select inbox
S: * 18 EXISTS
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
S: * 2 RECENT
S: * OK [UNSEEN 17] Message 17 is the first unseen message
S: * OK [UIDVALIDITY 3857529045] UIDs valid
S: a002 OK [READ-WRITE] SELECT completed
C: a003 fetch 12 full
S: * 12 FETCH (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700"
RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)"
"IMAP4rev1 WG mtg summary and minutes"
(("Terry Gray" NIL "gray" "cac.washington.edu"))
(("Terry Gray" NIL "gray" "cac.washington.edu"))
(("Terry Gray" NIL "gray" "cac.washington.edu"))
((NIL NIL "imap" "cac.washington.edu"))
((NIL NIL "minutes" "CNRI.Reston.VA.US")
("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL
"<[email protected]>")
BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 3028
92))
S: a003 OK FETCH completed
C: a004 fetch 12 body[header]
S: * 12 FETCH (BODY[HEADER] \{342\}
S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT)
S: From: Terry Gray <[email protected]>
S: Subject: IMAP4rev1 WG mtg summary and minutes
S: To: [email protected]
S: cc: [email protected], John Klensin <[email protected]>
S: Message-Id: <[email protected]>
S: MIME-Version: 1.0
S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
S:
S: )
S: a004 OK FETCH completed
C: a005 store 12 +flags \deleted
S: * 12 FETCH (FLAGS (\Seen \Deleted))
S: a005 OK +FLAGS completed
C: a006 logout
S: * BYE IMAP4rev1 server terminating connection
S: a006 OK LOGOUT completed
RFC 3501 IMAPv4 March 2003
-
Formale Syntax (Formal Syntax)Die folgende Syntaxspezifikation verwendet die erweiterte Backus-Naur- Form (ABNF) gemäß [ABNF].
Im Falle alternativer oder optionaler Regeln, bei denen eine spätere Regel eine frühere überlappt, MUSS die früher aufgeführte Regel Vorrang haben. Beispielsweise ist „\Seen", wenn es als Flag geparst wird, der Flag-Name \Seen und nicht eine flag-extension, obwohl „\Seen" als flag-extension geparst werden kann. Einige, aber nicht alle, Fälle dieser Regel sind nachstehend vermerkt.
Hinweis: Die [ABNF]-Regeln MÜSSEN strikt befolgt werden;
insbesondere:
(1) Sofern nicht anders vermerkt, sind alle alphabetischen
Zeichen groß-/kleinschreibungsinsensitiv. Die Verwendung von
Groß- oder Kleinbuchstaben zur Definition von Token-Zeichenketten
dient lediglich der besseren Lesbarkeit. Implementierungen MÜSSEN
diese Zeichenketten groß-/kleinschreibungsinsensitiv akzeptieren.
(2) In allen Fällen bezieht sich SP auf genau ein Leerzeichen.
Es ist NICHT zulässig, TAB zu ersetzen, zusätzliche Leerzeichen
einzufügen oder SP anderweitig als LWSP zu behandeln.
(3) Das ASCII-NUL-Zeichen, %x00, DARF zu keiner Zeit verwendet
werden.
address = "(" addr-name SP addr-adl SP addr-mailbox SP addr-host ")"
addr-adl = nstring ; Hält Route aus [RFC-2822] route-addr, falls ; nicht NIL
addr-host = nstring ; NIL kennzeichnet [RFC-2822]-Gruppensyntax. ; Andernfalls hält es den [RFC-2822]-Domänennamen
addr-mailbox = nstring ; NIL kennzeichnet das Ende der [RFC-2822]-Gruppe; ; falls nicht NIL und addr-host NIL ist, hält es ; den [RFC-2822]-Gruppennamen. ; Andernfalls hält es den [RFC-2822]-local-part ; nach Entfernen des [RFC-2822]-Quotings
RFC 3501 IMAPv4 March 2003
addr-name = nstring ; Falls nicht NIL, hält es die Phrase aus der ; [RFC-2822]-Mailbox nach Entfernen des [RFC-2822]- ; Quotings
append = "APPEND" SP mailbox [SP flag-list] [SP date-time] SP literal
astring = 1*ASTRING-CHAR / string
ASTRING-CHAR = ATOM-CHAR / resp-specials
atom = 1*ATOM-CHAR
ATOM-CHAR = <any CHAR except atom-specials>
atom-specials = "(" / ")" / "\{" / SP / CTL / list-wildcards / quoted-specials / resp-specials
authenticate = "AUTHENTICATE" SP auth-type *(CRLF base64)
auth-type = atom ; Definiert durch [SASL]
base64 = *(4base64-char) [base64-terminal]
base64-char = ALPHA / DIGIT / "+" / "/" ; Groß-/kleinschreibungssensitiv
base64-terminal = (2base64-char "==") / (3base64-char "=")
body = "(" (body-type-1part / body-type-mpart) ")"
body-extension = nstring / number / "(" body-extension *(SP body-extension) ")" ; Zukünftige Erweiterung. Client-Implementierungen ; MÜSSEN body-extension-Felder akzeptieren. Server- ; Implementierungen DÜRFEN KEINE body-extension-Felder ; erzeugen, außer wie durch künftige Standard- oder ; Standards-Track-Überarbeitungen dieser Spezifikation ; definiert.
body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]] ; DARF NICHT bei nicht erweiterbarem ; "BODY"-Fetch zurückgegeben werden
RFC 3501 IMAPv4 March 2003
body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]] ; DARF NICHT bei nicht erweiterbarem ; "BODY"-Fetch zurückgegeben werden
body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP body-fld-enc SP body-fld-octets
body-fld-desc = nstring
body-fld-dsp = "(" string SP body-fld-param ")" / nil
body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ "QUOTED-PRINTABLE") DQUOTE) / string
body-fld-id = nstring
body-fld-lang = nstring / "(" string *(SP string) ")"
body-fld-loc = nstring
body-fld-lines = number
body-fld-md5 = nstring
body-fld-octets = number
body-fld-param = "(" string SP string *(SP string SP string) ")" / nil
body-type-1part = (body-type-basic / body-type-msg / body-type-text) [SP body-ext-1part]
body-type-basic = media-basic SP body-fields ; MESSAGE-Subtyp DARF NICHT "RFC822" sein
body-type-mpart = 1*body SP media-subtype [SP body-ext-mpart]
body-type-msg = media-message SP body-fields SP envelope SP body SP body-fld-lines
body-type-text = media-text SP body-fields SP body-fld-lines
capability = ("AUTH=" auth-type) / atom ; Neue Fähigkeiten MÜSSEN mit "X" beginnen oder bei ; IANA als Standard oder Standards-Track registriert ; sein
RFC 3501 IMAPv4 March 2003
capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" *(SP capability) ; Server MÜSSEN die Fähigkeiten STARTTLS, AUTH=PLAIN ; und LOGINDISABLED implementieren. ; Server, die RFC-1730-Kompatibilität anbieten, MÜSSEN ; "IMAP4" als erste Fähigkeit aufführen.
CHAR8 = %x01-ff ; jedes OCTET außer NUL, %x00
command = tag SP (command-any / command-auth / command-nonauth / command-select) CRLF ; Modal basierend auf dem Zustand
command-any = "CAPABILITY" / "LOGOUT" / "NOOP" / x-command ; In allen Zuständen gültig
command-auth = append / create / delete / examine / list / lsub / rename / select / status / subscribe / unsubscribe ; Nur im Authentifizierten oder Ausgewählten Zustand ; gültig
command-nonauth = login / authenticate / "STARTTLS" ; Nur im Nicht-Authentifizierten Zustand gültig
command-select = "CHECK" / "CLOSE" / "EXPUNGE" / copy / fetch / store / uid / search ; Nur im Ausgewählten Zustand gültig
continue-req = "+" SP (resp-text / base64) CRLF
copy = "COPY" SP sequence-set SP mailbox
create = "CREATE" SP mailbox ; Verwendung von INBOX ergibt einen NO-Fehler
date = date-text / DQUOTE date-text DQUOTE
date-day = 1*2DIGIT ; Tag des Monats
date-day-fixed = (SP DIGIT) / 2DIGIT ; Festformat-Version von date-day
date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
date-text = date-day "-" date-month "-" date-year
RFC 3501 IMAPv4 March 2003
date-year = 4DIGIT
date-time = DQUOTE date-day-fixed "-" date-month "-" date-year SP time SP zone DQUOTE
delete = "DELETE" SP mailbox ; Verwendung von INBOX ergibt einen NO-Fehler
digit-nz = %x31-39 ; 1-9
envelope = "(" env-date SP env-subject SP env-from SP env-sender SP env-reply-to SP env-to SP env-cc SP env-bcc SP env-in-reply-to SP env-message-id ")"
env-bcc = "(" 1*address ")" / nil
env-cc = "(" 1*address ")" / nil
env-date = nstring
env-from = "(" 1*address ")" / nil
env-in-reply-to = nstring
env-message-id = nstring
env-reply-to = "(" 1*address ")" / nil
env-sender = "(" 1*address ")" / nil
env-subject = nstring
env-to = "(" 1*address ")" / nil
examine = "EXAMINE" SP mailbox
fetch = "FETCH" SP sequence-set SP ("ALL" / "FULL" / "FAST" / fetch-att / "(" fetch-att *(SP fetch-att) ")")
fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" /
"RFC822" [".HEADER" / ".SIZE" / ".TEXT"] /
"BODY" ["STRUCTURE"] / "UID" /
"BODY" section ["<" number "." nz-number ">"] /
"BODY.PEEK" section ["<" number "." nz-number ">"]
RFC 3501 IMAPv4 March 2003
flag = "\Answered" / "\Flagged" / "\Deleted" / "\Seen" / "\Draft" / flag-keyword / flag-extension ; Umfasst nicht "\Recent"
flag-extension = "" atom ; Zukünftige Erweiterung. Client-Implementierungen ; MÜSSEN flag-extension-Flags akzeptieren. Server- ; Implementierungen DÜRFEN KEINE flag-extension-Flags ; erzeugen, außer wie durch künftige Standard- oder ; Standards-Track-Überarbeitungen dieser Spezifikation ; definiert.
flag-fetch = flag / "\Recent"
flag-keyword = atom
flag-list = "(" [flag *(SP flag)] ")"
flag-perm = flag / "*"
greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF
header-fld-name = astring
header-list = "(" header-fld-name *(SP header-fld-name) ")"
list = "LIST" SP mailbox SP list-mailbox
list-mailbox = 1*list-char / string
list-char = ATOM-CHAR / list-wildcards / resp-specials
list-wildcards = "%" / "*"
literal = "\{" number "\}" CRLF *CHAR8 ; Zahl stellt die Anzahl der CHAR8s dar
login = "LOGIN" SP userid SP password
lsub = "LSUB" SP mailbox SP list-mailbox
RFC 3501 IMAPv4 March 2003
mailbox = "INBOX" / astring ; INBOX ist groß-/kleinschreibungsinsensitiv. Alle ; Schreibvarianten von INBOX (z. B. "iNbOx") MÜSSEN als ; INBOX und nicht als astring interpretiert werden. Ein ; astring, der aus der groß-/kleinschreibungsinsensitiven ; Folge "I" "N" "B" "O" "X" besteht, gilt als INBOX und ; nicht als astring. Bezug auf Abschnitt 5.1 für ; weitere semantische Details von Mailbox-Namen.
mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list / "LSUB" SP mailbox-list / "SEARCH" *(SP nz-number) / "STATUS" SP mailbox SP "(" [status-att-list] ")" / number SP "EXISTS" / number SP "RECENT"
mailbox-list = "(" [mbx-list-flags] ")" SP (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox
mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag *(SP mbx-list-oflag) / mbx-list-oflag *(SP mbx-list-oflag)
mbx-list-oflag = "\Noinferiors" / flag-extension ; Andere Flags; mehrere pro LIST-Antwort möglich
mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked" ; Selektierbarkeits-Flags; nur eines pro LIST-Antwort
media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" / "VIDEO") DQUOTE) / string) SP media-subtype ; Definiert in [MIME-IMT]
media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE ; Definiert in [MIME-IMT]
media-subtype = string ; Definiert in [MIME-IMT]
media-text = DQUOTE "TEXT" DQUOTE SP media-subtype ; Definiert in [MIME-IMT]
message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att))
msg-att = "(" (msg-att-dynamic / msg-att-static) *(SP (msg-att-dynamic / msg-att-static)) ")"
msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")" ; KANN sich für eine Nachricht ändern
RFC 3501 IMAPv4 March 2003
msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time /
"RFC822" [".HEADER" / ".TEXT"] SP nstring /
"RFC822.SIZE" SP number /
"BODY" ["STRUCTURE"] SP body /
"BODY" section ["<" number ">"] SP nstring /
"UID" SP uniqueid
; DARF sich für eine Nachricht nicht ändern
nil = "NIL"
nstring = string / nil
number = 1*DIGIT
; Vorzeichenlose 32-Bit-Ganzzahl
; (0 <= n < 4,294,967,296)
nz-number = digit-nz *DIGIT
; Von Null verschiedene vorzeichenlose 32-Bit-Ganzzahl
; (0 < n < 4,294,967,296)
password = astring
quoted = DQUOTE *QUOTED-CHAR DQUOTE
QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> /
"" quoted-specials
quoted-specials = DQUOTE / ""
rename = "RENAME" SP mailbox SP mailbox ; Verwendung von INBOX als Ziel ergibt einen NO-Fehler
response = *(continue-req / response-data) response-done
response-data = "*" SP (resp-cond-state / resp-cond-bye / mailbox-data / message-data / capability-data) CRLF
response-done = response-tagged / response-fatal
response-fatal = "*" SP resp-cond-bye CRLF ; Server schließt Verbindung sofort
response-tagged = tag SP resp-cond-state CRLF
resp-cond-auth = ("OK" / "PREAUTH") SP resp-text ; Authentifizierungsbedingung
RFC 3501 IMAPv4 March 2003
resp-cond-bye = "BYE" SP resp-text
resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text ; Statusbedingung
resp-specials = "]"
resp-text = ["[" resp-text-code "]" SP] text
resp-text-code = "ALERT" /
"BADCHARSET" [SP "(" astring *(SP astring) ")" ] /
capability-data / "PARSE" /
"PERMANENTFLAGS" SP "("
[flag-perm (SP flag-perm)] ")" /
"READ-ONLY" / "READ-WRITE" / "TRYCREATE" /
"UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number /
"UNSEEN" SP nz-number /
atom [SP 1<any TEXT-CHAR except "]">]
search = "SEARCH" [SP "CHARSET" SP astring] 1*(SP search-key) ; CHARSET-Argument MUSS bei IANA registriert sein
search-key = "ALL" / "ANSWERED" / "BCC" SP astring / "BEFORE" SP date / "BODY" SP astring / "CC" SP astring / "DELETED" / "FLAGGED" / "FROM" SP astring / "KEYWORD" SP flag-keyword / "NEW" / "OLD" / "ON" SP date / "RECENT" / "SEEN" / "SINCE" SP date / "SUBJECT" SP astring / "TEXT" SP astring / "TO" SP astring / "UNANSWERED" / "UNDELETED" / "UNFLAGGED" / "UNKEYWORD" SP flag-keyword / "UNSEEN" / ; Oberhalb dieser Zeile befanden sich in [IMAP2] "DRAFT" / "HEADER" SP header-fld-name SP astring / "LARGER" SP number / "NOT" SP search-key / "OR" SP search-key SP search-key / "SENTBEFORE" SP date / "SENTON" SP date / "SENTSINCE" SP date / "SMALLER" SP number / "UID" SP sequence-set / "UNDRAFT" / sequence-set / "(" search-key *(SP search-key) ")"
section = "[" [section-spec] "]"
section-msgtext = "HEADER" / "HEADER.FIELDS" [".NOT"] SP header-list / "TEXT" ; oberste Ebene oder MESSAGE/RFC822-Teil
RFC 3501 IMAPv4 March 2003
section-part = nz-number *("." nz-number) ; Verschachtelung von Body-Teilen
section-spec = section-msgtext / (section-part ["." section-text])
section-text = section-msgtext / "MIME" ; Text außer dem eigentlichen Body-Teil (Header usw.)
select = "SELECT" SP mailbox
seq-number = nz-number / "" ; Nachrichten-Sequenznummer (COPY-, FETCH-, STORE- ; Befehle) oder eindeutiger Bezeichner (UID COPY-, ; UID FETCH-, UID STORE-Befehle). ; * stellt die größte verwendete Zahl dar. Im ; Falle von Nachrichten-Sequenznummern ist es die ; Anzahl der Nachrichten in einer nicht-leeren Mailbox. ; Im Falle von eindeutigen Bezeichnern ist es der ; eindeutige Bezeichner der letzten Nachricht in der ; Mailbox oder, falls die Mailbox leer ist, der ; aktuelle UIDNEXT-Wert der Mailbox. ; Der Server SOLLTE mit einer getaggten BAD-Antwort auf ; einen Befehl antworten, der eine Nachrichten- ; Sequenznummer verwendet, die größer ist als die ; Anzahl der Nachrichten in der ausgewählten Mailbox. ; Dies umfasst "", falls die ausgewählte Mailbox leer ; ist.
seq-range = seq-number ":" seq-number ; zwei seq-number-Werte und alle Werte zwischen ; diesen beiden, unabhängig von der Reihenfolge. ; Beispiel: 2:4 und 4:2 sind äquivalent und bezeichnen ; die Werte 2, 3 und 4. ; Beispiel: Ein Bereich eindeutiger Bezeichner von ; 3291:* umfasst die UID der letzten Nachricht in der ; Mailbox, selbst wenn dieser Wert kleiner als 3291 ist.
sequence-set = (seq-number / seq-range) ("," sequence-set) ; Menge von seq-number-Werten, unabhängig von der ; Reihenfolge. Server KÖNNEN Überlappungen zusammen- ; fassen und/oder die Sequenz in beliebiger Reihenfolge ; ausführen. ; Beispiel: Eine Nachrichten-Sequenznummern-Menge von ; 2,4:7,9,12: für eine Mailbox mit 15 Nachrichten ist ; äquivalent zu 2,4,5,6,7,9,12,13,14,15. ; Beispiel: Eine Nachrichten-Sequenznummern-Menge von ; *:4,5:7 für eine Mailbox mit 10 Nachrichten ist ; äquivalent zu 10,9,8,7,6,5,4,5,6,7 und KANN neu ; geordnet und überlappend zusammengefasst werden zu ; 4,5,6,7,8,9,10.
RFC 3501 IMAPv4 March 2003
status = "STATUS" SP mailbox SP "(" status-att *(SP status-att) ")"
status-att = "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" / "UNSEEN"
status-att-list = status-att SP number *(SP status-att SP number)
store = "STORE" SP sequence-set SP store-att-flags
store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP (flag-list / (flag *(SP flag)))
string = quoted / literal
subscribe = "SUBSCRIBE" SP mailbox
tag = 1*<any ASTRING-CHAR except "+">
text = 1*TEXT-CHAR
TEXT-CHAR = <any CHAR except CR and LF>
time = 2DIGIT ":" 2DIGIT ":" 2DIGIT ; Stunden Minuten Sekunden
uid = "UID" SP (copy / fetch / search / store) ; Eindeutige Bezeichner anstelle von ; Nachrichten-Sequenznummern
uniqueid = nz-number ; Streng aufsteigend
unsubscribe = "UNSUBSCRIBE" SP mailbox
userid = astring
x-command = "X" atom <experimental command arguments>
zone = ("+" / "-") 4DIGIT ; Vorzeichenbehafteter vierstelliger Wert hhmm, der ; Stunden und Minuten östlich von Greenwich angibt (das ; ist die Differenz der angegebenen Zeit zur ; Universalzeit). Subtrahiert man die Zeitzone von der ; angegebenen Zeit, ergibt sich die UT-Form. ; Die Universalzeit-Zone ist "+0000".
RFC 3501 IMAPv4 March 2003
-
Anmerkung des Autors (Author's Note)
Dieses Dokument ist eine Überarbeitung oder Neufassung früherer Dokumente und ersetzt die Protokollspezifikation in jenen Dokumenten: RFC 2060, RFC 1730, das unveröffentlichte Dokument IMAP2bis.TXT, RFC 1176 und RFC 1064.
-
Sicherheitsüberlegungen (Security Considerations)
IMAP4rev1-Protokolltransaktionen, einschließlich elektronischer Postdaten, werden im Klartext über das Netz gesendet, sofern kein Schutz vor dem Mitlesen ausgehandelt wird. Dies kann entweder durch die Verwendung von STARTTLS, ausgehandelten Datenschutzschutz im AUTHENTICATE-Befehl oder einen anderen Schutzmechanismus erreicht werden.
11.1. STARTTLS-Sicherheitsüberlegungen (STARTTLS Security Considerations)
Die Spezifikation des STARTTLS-Befehls und der LOGINDISABLED- Fähigkeit in diesem Dokument ersetzt die in [IMAP-TLS]. [IMAP-TLS] bleibt normativ für den PLAIN-[SASL]-Authentifikator.
IMAP-Client- und Server-Implementierungen MÜSSEN die TLS_RSA_WITH_RC4_128_MD5-[TLS]-Verschlüsselungssammlung implementieren und SOLLTEN die TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA-[TLS]- Verschlüsselungssammlung implementieren. Dies ist wichtig, da es sicherstellt, dass je zwei konforme Implementierungen so konfiguriert werden können, dass sie interoperieren. Alle anderen Verschlüsselungssammlungen sind OPTIONAL. Beachten Sie, dass dies eine Änderung gegenüber Abschnitt 2.1 von [IMAP-TLS] ist.
Während der [TLS]-Aushandlung MUSS der Client sein Verständnis des Server-Hostnamens gegen die Identität des Servers prüfen, wie sie in der Server-Zertifikatsnachricht dargestellt wird, um Man-in-the-Middle-Angriffe zu verhindern. Schlägt der Abgleich fehl, SOLLTE der Client entweder um ausdrückliche Benutzerbestätigung bitten oder die Verbindung abbrechen und angeben, dass die Identität des Servers verdächtig ist. Der Abgleich erfolgt nach diesen Regeln:
Der Client MUSS den Server-Hostnamen, mit dem er die Verbindung
geöffnet hat, als Vergleichswert gegen den Servernamen verwenden,
wie er im Server-Zertifikat ausgedrückt ist. Der Client DARF
NICHT eine Form des Server-Hostnamens verwenden, die aus einer
unsicheren fernen Quelle stammt (z. B. unsichere DNS-Abfrage).
CNAME-Kanonisierung wird nicht durchgeführt.
Wenn eine subjectAltName-Erweiterung vom Typ dNSName im
Zertifikat vorhanden ist, SOLLTE sie als Quelle der Identität des
Servers verwendet werden.
Der Abgleich ist groß-/kleinschreibungsinsensitiv.
RFC 3501 IMAPv4 March 2003
Ein „*"-Platzhalterzeichen KANN als linkeste Namenskomponente im
Zertifikat verwendet werden. Beispielsweise würde *.example.com auf
a.example.com, foo.example.com usw. passen, aber nicht auf
example.com.
Wenn das Zertifikat mehrere Namen enthält (z. B. mehr als ein
dNSName-Feld), so gilt ein Abgleich mit einem der Felder als
akzeptabel.
Sowohl Client als auch Server MÜSSEN das Ergebnis des STARTTLS-Befehls und der anschließenden [TLS]-Aushandlung prüfen, um festzustellen, ob eine akzeptable Authentifizierung oder Privatsphäre erreicht wurde.
11.2. Weitere Sicherheitsüberlegungen (Other Security Considerations)
Eine Server-Fehlermeldung für einen AUTHENTICATE-Befehl, der aufgrund ungültiger Anmeldedaten fehlschlägt, SOLLTE NICHT im Detail angeben, warum die Anmeldedaten ungültig sind.
Die Verwendung des LOGIN-Befehls sendet Passwörter im Klartext. Dies kann vermieden werden, indem der AUTHENTICATE-Befehl mit einem [SASL]- Mechanismus verwendet wird, der keine Klartext-Passwörter nutzt, oder indem zuvor eine Verschlüsselung über STARTTLS oder einen anderen Schutzmechanismus ausgehandelt wird.
Eine Server-Implementierung MUSS eine Konfiguration implementieren, die zum Zeitpunkt der Authentifizierung verlangt: (1) Der STARTTLS-Befehl wurde ausgehandelt. ODER (2) Es wurde ein anderer Mechanismus bereitgestellt, der die Sitzung vor dem Mitlesen von Passwörtern schützt. ODER (3) Folgende Maßnahmen sind vorhanden: (a) Die LOGINDISABLED-Fähigkeit wird angekündigt, und [SASL]- Mechanismen (wie PLAIN), die Klartext-Passwörter verwenden, werden NICHT in der CAPABILITY-Liste angekündigt. UND (b) Der LOGIN-Befehl gibt einen Fehler zurück, selbst wenn das Passwort korrekt ist. UND (c) Der AUTHENTICATE-Befehl gibt einen Fehler mit allen [SASL]- Mechanismen zurück, die Klartext-Passwörter verwenden, selbst wenn das Passwort korrekt ist.
Eine Server-Fehlermeldung für einen fehlschlagenden LOGIN-Befehl SOLLTE NICHT angeben, dass der Benutzername und nicht das Passwort ungültig ist.