RFC 4819

Secure Shell Public Key Subsystem

๐Ÿ“… published March 2007, from ietf

Secure Shell Public Key Subsystem ๐ŸŽ€

Okay bestie, this is RFC 4819 ๐Ÿ’–, a Standards Track doc from the IETF (Network Working Group), dated March 2007. Three people wrote it: J. Galbraith and J. Van Dyke from VanDyke Software, and J. Bright from Silicon Circus ๐Ÿ‘‘. The header doesn't list anything it obsoletes or updates, so it's a fresh start โœจ.

Status of This Memo

This is an Internet standards track protocol for the Internet community, and the authors want your discussion and suggestions for improvements ๐Ÿซถ. For the standardization state and status, check the current edition of the "Internet Official Protocol Standards" (STD 1). Distribution of this memo is unlimited ๐ŸŒˆ.

Copyright (C) The IETF Trust (2007) ๐Ÿ’œ.

Abstract

Okay so Secure Shell has a user authentication mechanism based on public keys, but it doesn't say anything about how keys get distributed ๐Ÿ˜ญ. There's no common key management solution in current implementations, which is literally chaos ๐Ÿ’€. This document describes a protocol for configuring public keys in an implementation-independent way, so client software can take on that work for you ๐Ÿงš.

The Public Key Subsystem gives you a server-independent way to add public keys, remove public keys, and list the current public keys the server knows about ๐Ÿ”‘. Managing keys is specific and limited to the authenticated user, so nobody else gets to touch your keys ๐Ÿ’….

A public key can also come with restrictions, including a mandatory command or subsystem ๐Ÿ”’.

Table of Contents

1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
2.  Terminology  . . . . . . . . . . . . . . . . . . . . . . . . .  3
3.  Public Key Subsystem Overview  . . . . . . . . . . . . . . . .  3
  3.1.  Opening the Public Key Subsystem . . . . . . . . . . . . .  4
  3.2.  Requests and Responses . . . . . . . . . . . . . . . . . .  5
  3.3.  The Status Message . . . . . . . . . . . . . . . . . . . .  5
    3.3.1.  Status Codes . . . . . . . . . . . . . . . . . . . . .  5
  3.4.  The Version Packet . . . . . . . . . . . . . . . . . . . .  6
4.  Public Key Subsystem Operations  . . . . . . . . . . . . . . .  7
  4.1.  Adding a Public Key  . . . . . . . . . . . . . . . . . . .  7
  4.2.  Removing a Public Key  . . . . . . . . . . . . . . . . . . 10
  4.3.  Listing Public Keys  . . . . . . . . . . . . . . . . . . . 10
  4.4.  Listing Server Capabilities  . . . . . . . . . . . . . . . 10
5.  Security Considerations  . . . . . . . . . . . . . . . . . . . 11
6.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 12
  6.1.  Registrations  . . . . . . . . . . . . . . . . . . . . . . 12
  6.2.  Names  . . . . . . . . . . . . . . . . . . . . . . . . . . 12
    6.2.1.  Conventions for Names  . . . . . . . . . . . . . . . . 12
    6.2.2.  Future Assignments of Names  . . . . . . . . . . . . . 13
  6.3.  Public Key Subsystem Request Names . . . . . . . . . . . . 13
  6.4.  Public Key Subsystem Response Names  . . . . . . . . . . . 13
  6.5.  Public Key Subsystem Attribute Names . . . . . . . . . . . 13
  6.6.  Public Key Subsystem Status Codes  . . . . . . . . . . . . 14
    6.6.1.  Conventions  . . . . . . . . . . . . . . . . . . . . . 14
    6.6.2.  Initial Assignments  . . . . . . . . . . . . . . . . . 14
    6.6.3.  Future Assignments . . . . . . . . . . . . . . . . . . 15
7.  References . . . . . . . . . . . . . . . . . . . . . . . . . . 15
  7.1.  Normative References . . . . . . . . . . . . . . . . . . . 15
  7.2.  Informative References . . . . . . . . . . . . . . . . . . 15
8.  Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 16

1. Introduction โœจ

Secure Shell (SSH) is how you do secure remote login and other secure network stuff over an insecure network ๐Ÿง. It has a public key user authentication mechanism, but no key distribution mechanism at all, so it's kinda giving incomplete ๐Ÿ™ˆ. The usual move is to log in once with a password and then copy your public key over to the server. The catch is that no two implementations use the same mechanism to set that key up, so it's a mess ๐Ÿ˜ญ.

This document describes a subsystem that configures public keys in an implementation-independent way ๐Ÿ’–. Client software takes on the setup work so you don't have to. The Public Key Subsystem protocol is built for extreme simplicity in implementation ๐Ÿ“. It is not meant to replace the Public Key Infrastructure for X.509 Certificates (PKIX) ๐Ÿ™…โ€โ™€๏ธ.

The Secure Shell Public Key Subsystem runs on top of the Secure Shell transport layer [2] and user authentication protocols [3] ๐ŸŒธ. It gives the client a simple way to manage the server's public keys ๐Ÿฆ‹.

Read the Secure Shell architecture [1] and Secure Shell connection [4] documents before this one, no skipping ๐Ÿ“š.

This protocol is used from the Secure Shell Connection Protocol [4] as a subsystem, as described in the section "Starting a Shell or a Command" ๐ŸŽ€. The subsystem name is publickey.

You have to be able to authenticate in some way before this protocol works ๐Ÿ”. If password authentication is in use, servers SHOULD provide a configuration option to turn off password authentication once the first public key is added, which is a very responsible move ๐Ÿ‘‘.

2. Terminology ๐Ÿ’…

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [5] ๐Ÿ“–.

3. Public Key Subsystem Overview ๐ŸŒˆ

The Public Key Subsystem is the server-independent setup for adding public keys, removing them, and listing the ones the server currently knows about ๐Ÿ”‘. The subsystem name is publickey.

Public keys that are added, removed, or listed through this protocol belong only to the authenticated user ๐Ÿซถ. Nobody else's keys are in play.

Adding, removing, and listing your keys all happen through request packets sent to the server ๐Ÿ“ฎ. The server sends back response packets that say whether it worked or not, plus any specific response data ๐Ÿ’Œ.

The public key blob format is detailed in Section 6.6, "Public Key Algorithms" of the SSH Transport Protocol document [2] ๐Ÿงพ.

3.1. Opening the Public Key Subsystem ๐Ÿšช

The Public Key Subsystem starts when a client sends an SSH_MSG_CHANNEL_REQUEST over an existing session's channel โœจ.

How a session gets opened is covered in the SSH Connection Protocol document [4], in the section "Opening a Session" ๐Ÿ“š.

To open the Public Key Subsystem, the client sends this:

     byte      SSH_MSG_CHANNEL_REQUEST
     uint32    recipient channel
     string    "subsystem"
     boolean   want reply
     string    "publickey"

Client implementations SHOULD reject this request, because it's normally only sent by the client ๐Ÿ™…โ€โ™€๏ธ.

If want reply is TRUE, the server MUST respond with SSH_MSG_CHANNEL_SUCCESS if the Public Key Subsystem started successfully ๐ŸŽ‰. It MUST respond with SSH_MSG_CHANNEL_FAILURE if the server failed to start or doesn't support the Public Key Subsystem ๐Ÿ’€.

The server SHOULD respond with SSH_MSG_CHANNEL_FAILURE if the user isn't allowed to access the Public Key Subsystem, for example because they authenticated with a restricted public key ๐Ÿ”’.

It is RECOMMENDED that clients request the reply for this request and check it ๐Ÿซถ.

3.2. Requests and Responses ๐Ÿ“ฌ

Every Public Key Subsystem request and response is sent in this form:

     uint32    length
     string    name
     ... request/response specific data follows

The length field is the length of the name field plus the request/response-specific data. It does not include the length of the length field itself ๐Ÿ“. The client MUST receive acknowledgement of each request before it sends a new request. No speed-running allowed ๐Ÿข.

The version packet and every request and response described in Section 4 are defined by the 'name' field and the data part of the packet ๐Ÿงฉ.

3.3. The Status Message ๐Ÿšฆ

A request gets acknowledged by sending a status packet. If the request has response data, the status packet goes out after all of that data has been sent ๐Ÿ“ฆ.

     string    "status"
     uint32    status code
     string    description [7]
     string    language tag [6]

A status message MUST be sent for any unrecognized packets. The request SHOULD NOT close the subsystem, so it stays open and happy ๐ŸŒธ.

3.3.1. Status Codes ๐Ÿ”ข

The status code gives the status in a more machine-readable format (good for localization), and it can be any of these values ๐Ÿง :

     SSH_PUBLICKEY_SUCCESS                      0
     SSH_PUBLICKEY_ACCESS_DENIED                1
     SSH_PUBLICKEY_STORAGE_EXCEEDED             2
     SSH_PUBLICKEY_VERSION_NOT_SUPPORTED        3
     SSH_PUBLICKEY_KEY_NOT_FOUND                4
     SSH_PUBLICKEY_KEY_NOT_SUPPORTED            5
     SSH_PUBLICKEY_KEY_ALREADY_PRESENT          6
     SSH_PUBLICKEY_GENERAL_FAILURE              7
     SSH_PUBLICKEY_REQUEST_NOT_SUPPORTED        8
     SSH_PUBLICKEY_ATTRIBUTE_NOT_SUPPORTED      9

If a request completes successfully, the server MUST send the status code SSH_PUBLICKEY_SUCCESS โœ…. The failure codes mean exactly what their names say ๐Ÿ™ƒ.

3.4. The Version Packet ๐Ÿ”–

Both sides MUST start a connection by sending a version packet that says which version of the protocol they're using ๐Ÿ.

     string "version"
     uint32 protocol-version-number

This document describes version 2 of the protocol. Version 1 was used by an early draft of this document. The version number went up after changes to how status packets are handled ๐Ÿ“ˆ.

Both sides send the highest version they implement, and the lower of the two version numbers is the one that gets used ๐Ÿค. If either side can't support the lower version, it should close the subsystem and tell the other side by sending an SSH_MSG_CHANNEL_CLOSE message ๐Ÿ‘‹. Before closing the subsystem, a status message with the status SSH_PUBLICKEY_VERSION_NOT_SUPPORTED SHOULD be sent. Normally, status messages are only sent by the server, in response to requests from the client. This is the only time the client sends a status message ๐Ÿซฃ.

Both sides MUST wait to receive this version before continuing ๐Ÿ›‘. The "version" packet MUST NOT be sent again after this first exchange ๐Ÿšซ. The SSH_PUBLICKEY_VERSION_NOT_SUPPORTED status code must not be sent in response to any other request.

Implementations MAY use the first 15 bytes of the version packet as a "magic cookie" so they don't process spurious output from the user's shell (as described in Section 6.5 of [4]) ๐Ÿช„. Those bytes will always be:

   0x00 0x00 0x00 0x0F 0x00 0x00 0x00 0x07 0x76 0x65 0x72 0x73 0x69 0x6F
   0x6E

4. Public Key Subsystem Operations ๐Ÿงš

Okay, the Public Key Subsystem currently defines four operations: add, remove, list, and listattributes ๐Ÿ’œ.

Part 2 picks up with Section 4.1, Adding a Public Key, and it's where things get really good ๐Ÿ’…๐Ÿ”ฅ.

4.1. Adding a Public Key โœจ

okay so when the client wants to add a public key, it sends this bundle ๐ŸŽ€

        string    "add"
        string    public key algorithm name
        string    public key blob
        boolean   overwrite
        uint32    attribute-count
         string    attrib-name
         string    attrib-value
         bool      critical
        repeated attribute-count times

the server MUST attempt to store the key for that user in the right spot ๐Ÿ—‚๏ธ so it can be used for later public key authentications. if overwrite is false and the key is already there, the server MUST return SSH_PUBLICKEY_KEY_ALREADY_PRESENT. if it sends that back, the client SHOULD give the user a choice to overwrite the key ๐Ÿ’…. if overwrite is true and the key already exists but can't be overwritten, the server MUST return SSH_PUBLICKEY_ACCESS_DENIED ๐Ÿ™…

attribute names follow the same naming scheme as algorithm names in [1] ๐Ÿท๏ธ. if the server doesn't implement a critical attribute, it MUST fail the add with the status code SSH_PUBLICKEY_ATTRIBUTE_NOT_SUPPORTED. and for critical attributes, just storing it is NOT enough ๐Ÿ˜ญ. the server has to actually understand and carry out what the attribute is for.

the following attributes are currently defined ๐Ÿ‘‘:

comment

the comment attribute holds user-written text about the key ๐Ÿ“. the server SHOULD make every effort to keep this value and send it back with the key during any later list operation. the server MUST NOT try to interpret or act on the content of the comment in any way. the comment attribute must be written in UTF-8 format [7] ๐ŸŒธ.

honestly this one is so useful, because the user can identify the key without having to compare fingerprints ๐Ÿ”. this attribute SHOULD NOT be critical.

comment-language

if this attribute is specified, it MUST come right after a comment attribute and name the language for that comment [6] ๐ŸŒ. the client MAY give more than one comment, as long as it also gives a different language for each one. the server SHOULD try to store each comment together with its language attribute. this attribute SHOULD NOT be critical.

command-override

command-override sets a command that gets run whenever this key is in use ๐ŸŽฌ. the server should run it when it gets an exec or shell request from the client, instead of the command or shell that would normally have run because of that request. if the command string is empty, both exec and shell requests should be denied ๐Ÿšซ. if there's no command-override attribute, all exec and shell requests should be allowed (as long as they still pass any other security or authorization checks the server does) โœ…. this attribute SHOULD be critical.

subsystem

subsystem is a comma-separated list of subsystems that can be started (using a subsystem request) while this key is in use ๐Ÿงฉ. this attribute SHOULD be critical. if the value is empty, no subsystems can be started. if there's no subsystem attribute, there are no limits on which subsystems can be started when someone authenticates with this key.

x11

x11 means X11 forwarding may not be performed while this key is in use ๐Ÿ–ฅ๏ธ. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.

shell

shell means session channel shell requests should be denied while this key is in use ๐Ÿš. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.

exec

exec means session channel exec requests should be denied while this key is in use โ›”. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.

agent

agent means session channel auth-agent-req requests should be denied while this key is in use ๐Ÿ•ต๏ธ. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.

env

env means session channel env requests should be denied while this key is in use ๐ŸŒฟ. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.

from

from is a comma-separated list of hosts that the key may be used from ๐Ÿ . if a host that isn't on this list tries to use the key for authorization, the authorization attempt MUST be denied ๐Ÿ›‘. the server SHOULD make a log entry about this. the server MAY offer a method for administrators to stop a host from appearing in this list. the server should use whatever method is appropriate for its platform to identify the host, e.g., for IP-based networks, checking the IP address or doing a reverse DNS lookup ๐Ÿ”Ž. for IP-based networks, it is anticipated that each element of the from parameter will take the form of a specific IP address or hostname ๐ŸŒ.

port-forward

port-forward means no direct-tcpip requests should be accepted, except the ones going to hosts listed in the comma-separated list given as this attribute's value ๐Ÿšช. if the value is empty, every direct-tcpip request should be refused while this key is in use. this attribute SHOULD be critical.

reverse-forward

reverse-forward means no tcpip-forward requests should be accepted, except for the port numbers in the comma-separated list given as this attribute's value ๐Ÿ”. if the value is empty, every tcpip-forward request should be refused while this key is in use. this attribute SHOULD be critical.

on top of whatever attributes the client asks for, the server MAY offer a method for administrators to enforce certain attributes compulsorily ๐Ÿ‘‘โœจ.

4.2. Removing a Public Key ๐Ÿ—‘๏ธ

if the client wants to remove a public key, it sends:

        string    "remove"
        string    public key algorithm name
        string    public key blob

the server MUST attempt to remove the public key for the user from the appropriate location, so that the key can't be used for any later authentications ๐Ÿ™…โ€โ™€๏ธ.

4.3. Listing Public Keys ๐Ÿ“‹

if the client wants to see the keys the server knows about, it sends:

        string    "list"

the server answers with zero or more of these responses:

        string    "publickey"
        string    public key algorithm name
        string    public key blob
        uint32    attribute-count
         string    attrib-name
         string    attrib-value
        repeated attribute-count times

there's no requirement on the order of the responses ๐Ÿ”€. some servers might send them in a particular order, but client implementations should not rely on the responses coming in any order, okay? ๐Ÿ™ˆ

after the last "publickey" response, a status packet MUST be sent ๐Ÿ“ฌ.

implementations SHOULD support this request ๐Ÿ’–.

4.4. Listing Server Capabilities ๐Ÿงฐ

if the client wants to know which key attributes the server supports, it sends:

        string    "listattributes"

the server answers with zero or more of these responses:

        string    "attribute"
        string    attribute name
        boolean   compulsory

the compulsory field says whether this attribute will be forced onto any added keys (no matter whether the client asked for it) because of administrative settings on the server ๐Ÿ”’. if the server doesn't support administrative settings like that, it MUST return false in the compulsory field.

here's an example, because this one is kind of a plot twist ๐ŸŽญ. say the server has a config file that says the user isn't allowed shell access. the server would return the "shell" attribute with compulsory set to true. then, whatever attributes the user asks for on their key, the server would also apply "shell", which makes it impossible for the user to use a shell ๐Ÿ’€.

after the last "attribute" response, a status packet MUST be sent ๐Ÿ“ฌ.

an implementation MAY choose not to support this request ๐Ÿคทโ€โ™€๏ธ.

5. Security Considerations ๐Ÿšจ

this protocol assumes it runs over a secure channel and that both endpoints of that channel have been authenticated ๐Ÿ”. so this protocol assumes it's already protected from network-level attacks from the outside.

this protocol gives a way to upload and change client authentication data ๐Ÿ“ค. it's the server implementation's job to enforce whatever access controls are needed to limit what any particular user can do (the user is authenticated outside this protocol, typically using the SSH User Authentication Protocol [3]). the big danger is that users can overwrite an existing key on the server with this protocol while also giving the new key fewer restrictions than the old one had ๐Ÿ˜ฑ. servers should take care that clients can't override presets from the server's administrator when this happens. this is very important, bestie ๐Ÿซถ.

this protocol requires the client to assume that the server will correctly implement and observe the attributes applied to keys ๐Ÿคž. implementation errors in the server could make clients authorize keys for access they weren't meant to have, or apply fewer restrictions than were intended ๐Ÿ’”.

6. IANA Considerations ๐Ÿ—‚๏ธ

this section covers the conventions for naming the namespaces, the initial state of the registry, and instructions for future assignments ๐Ÿ“š.

6.1. Registrations ๐Ÿ“

consistent with Section 4.9.5 of [8], this document makes the following registration:

the subsystem name "publickey" ๐ŸŽ‰.

6.2. Names ๐Ÿท๏ธ

in the sections that follow, the values for the namespaces are textual ๐Ÿ’ฌ. the conventions and instructions to the IANA for future assignments are in this section. the initial assignments are given in their own sections.

6.2.1. Conventions for Names ๐Ÿ“

all names registered by the IANA in the following sections MUST be printable US-ASCII strings, and they MUST NOT contain the at-sign "@", the comma ",", or any whitespace or control characters (ASCII codes 32 or less) ๐Ÿšซ. names are case-sensitive, and they MUST NOT be longer than 64 characters ๐Ÿ“.

there's a provision here for locally extensible names ๐ŸŒˆ. the IANA will not register and will not control names with an at-sign in them. names with an at-sign will have the format name@domainname (no double quotes), where the part before the at-sign is the name. the format of that part isn't specified. however, these names MUST be printable US-ASCII strings, and they MUST NOT contain the comma character (","), any whitespace, or any control characters (ASCII codes 32 or less). the part after the at-sign MUST be a valid, fully qualified Internet domain name [10] controlled by the person or organization defining the name ๐ŸŒ. names are case-sensitive, and they MUST NOT be longer than 64 characters. each domain decides how it manages its own local namespace ๐Ÿก.

someone noticed these names look like STD 11 [9] email addresses ๐Ÿ“ง. that's purely a coincidence, and it actually has nothing to do with STD 11 [9] ๐Ÿ™ƒ. an example of a locally defined name is our-attribute@example.com (no double quotes) ๐Ÿ’œ.

6.2.2. Future Assignments of Names โœจ

okay so if anyone wants to add a brand new Name later, it MUST go through the IETF Consensus process described in [11]. no shortcuts, bestie ๐Ÿซถ

6.3. Public Key Subsystem Request Names ๐Ÿ“จ

here are the starter Request names IANA is handing out, lowkey iconic ๐Ÿ’Œ

Request Name
-------------
version
add
remove
list
listattributes

6.4. Public Key Subsystem Response Names ๐Ÿ’ฌ

and these are the initial Response names ๐ŸŽ€

Response Name
--------------
version
status
publickey
attribute

6.5. Public Key Subsystem Attribute Names ๐Ÿท๏ธ

attributes are how you define properties or restrictions on a public key, so they're basically the fine print on each key ๐Ÿง here are the first ones IANA assigned ๐ŸŒธ

Attribute Name
---------------
comment
comment-language
command-override
subsystem
x11
shell
exec
agent
env
from
port-forward
reverse-forward

6.6. Public Key Subsystem Status Codes ๐Ÿšฆ

the status code is a single byte that tells you how a request went. it's the little traffic light for every request ๐Ÿšฆ๐Ÿ’–

6.6.1. Conventions ๐Ÿ“

status responses carry codes from 0 to 255, and they're divided up like this. the chunk from 192 to 255 is set aside for local, private extensions, so that's your own playground ๐Ÿงš

6.6.2. Initial Assignments ๐ŸŽ‰

this table is the official list of the starter Public Key Subsystem status code values. the Reference column is left blank here ๐ŸŒˆ

Status code                           Value    Reference
------------                          -----    ---------
SSH_PUBLICKEY_SUCCESS                   0
SSH_PUBLICKEY_ACCESS_DENIED             1
SSH_PUBLICKEY_STORAGE_EXCEEDED          2
SSH_PUBLICKEY_VERSION_NOT_SUPPORTED     3
SSH_PUBLICKEY_KEY_NOT_FOUND             4
SSH_PUBLICKEY_KEY_NOT_SUPPORTED         5
SSH_PUBLICKEY_KEY_ALREADY_PRESENT       6
SSH_PUBLICKEY_GENERAL_FAILURE           7
SSH_PUBLICKEY_REQUEST_NOT_SUPPORTED     8
SSH_PUBLICKEY_ATTRIBUTE_NOT_SUPPORTED   9

6.6.3. Future Assignments ๐Ÿ”ฎ

if you want a new status code in the 0 to 191 range, it MUST go through the Standards Action method described in [11]. this is serious business, so no freelancing ๐Ÿ’…

IANA doesn't manage the 192 to 255 range at all. that's reserved for private use, so hands off ๐Ÿ™…โ€โ™€๏ธโœจ

7. References ๐Ÿ“š

7.1. Normative References ๐Ÿ”’

[1]   Ylonen, T. and C. Lonvick, "The Secure Shell (SSH) Protocol
      Architecture", RFC 4251, January 2006.

[2]   Ylonen, T. and C. Lonvick, "The Secure Shell (SSH) Transport
      Layer Protocol", RFC 4253, January 2006.

[3]   Ylonen, T. and C. Lonvick, "The Secure Shell (SSH)
      Authentication Protocol", RFC 4252, January 2006.

[4]   Ylonen, T. and C. Lonvick, "The Secure Shell (SSH) Connection
      Protocol", RFC 4254, January 2006.

[5]   Bradner, S., "Key words for use in RFCs to Indicate Requirement
      Levels", BCP 14, RFC 2119, March 1997.

[6]   Phillips, A. and M. Davis, "Tags for Identifying Languages",
      BCP 47, RFC 4646, September 2006.

[7]   Yergeau, F., "UTF-8, a transformation format of ISO 10646",
      STD 63, RFC 3629, November 2003.

7.2. Informative References ๐Ÿ“–

[8]   Lehtinen, S. and C. Lonvick, "The Secure Shell (SSH) Protocol
      Assigned Numbers", RFC 4250, January 2006.

[9]   Crocker, D., "Standard for the format of ARPA Internet text
      messages", STD 11, RFC 822, August 1982.

[10]  Mockapetris, P., "Domain names - concepts and facilities",
      STD 13, RFC 1034, November 1987.

[11]  Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA
      Considerations Section in RFCs", BCP 26, RFC 2434,
      October 1998.

8. Acknowledgements ๐Ÿซถ

Brent McClure helped write this document, and he's a whole vibe for it ๐ŸŒŸ

Authors' Addresses ๐Ÿ—บ๏ธ

Joseph Galbraith
VanDyke Software
4848 Tramway Ridge Blvd
Suite 101
Albuquerque, NM  87111
US

Phone: +1 505 332 5700
EMail: galb@vandyke.com


Jeff P. Van Dyke
VanDyke Software
4848 Tramway Ridge Blvd
Suite 101
Albuquerque, NM  87111
US

Phone: +1 505 332 5700
EMail: jpv@vandyke.com


Jon Bright
Silicon Circus
24 Jubilee Road
Chichester, West Sussex  PO19 7XB
UK

Phone: +49 172 524 0521
EMail: jon@siliconcircus.com

Copyright (C) The IETF Trust (2007).

This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights.

This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Intellectual Property ๐Ÿชช

The IETF takes no position regarding the validity or scope of any Intellectual Property Rights or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; nor does it represent that it has made any independent effort to identify any such rights. Information on the procedures with respect to rights in RFC documents can be found in BCP 78 and BCP 79.

Copies of IPR disclosures made to the IETF Secretariat and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr.

The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org.

Acknowledgement ๐Ÿ’œ

Funding for the RFC Editor function is currently provided by the Internet Society.

๐Ÿ“ฆ where this page comes from