<?xml version='1.0'?>
<!DOCTYPE rfc SYSTEM 'rfc2629.dtd'>
<rfc ipr="trust200902" docName="draft-hallambaker-acme-omnipublish-00">
<front>
<title abbrev="OmniBroker Publication Protocol">OmniBroker Publication Protocol</title>
<author fullname="Phillip Hallam-Baker" initials="P. M." surname="Hallam-Baker">
<organization>Comodo Group Inc.</organization>
<address>
<email>philliph@comodo.com</email>
</address>
</author>
<date day="6" month="July" year="2015"/>
<area>General</area>
<workgroup/>
<keyword>Transparency</keyword>
<keyword>PKI</keyword>
<keyword>PKIX</keyword>
<abstract>
<t>OmniPublish is a Web Service that supports server configuration management. The supported transaction set allows a server to obtain and renew necessary cryptographic credentials, publish service discovery statements and obtain network configuration specifications. </t>
</abstract>
</front>
<middle>
<section title="Definitions" anchor="Section_1">
<section title="Requirements Language" anchor="Section_1_1">
<t>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 [RFC2119]. </t>
</section>
</section>
<section title="Introduction" anchor="Section_2">
<t>OmniPublish is a Web Service that supports server configuration management. The supported transaction set allows a server to obtain and renew necessary cryptographic credentials, publish service discovery statements and obtain network configuration specifications. </t>
<t>The services supported by OmniPublish are complimentary to the services provided by OmniBroker [I-D.hallambaker-omnibroker] and the protocols share the same transport binding (HTTP, UYFM) and encoding options (JSON). </t>
<section title="Traditional Server Configuration Approach " anchor="Section_2_1">
<t>In the traditional approach to server configuration the network administrator is required to anticipate and perform all the necessary configuration needs of the service. For an enterprise server these steps will typically include: </t>
<t><list style="symbols">
<t>Enter server parameters in the DNS.</t>
<t>Configure firewall to permit external access.</t>
<t>Generate Public/Private Keypair.</t>
<t>Apply for digital certificate.</t>
<t>Install digital certificate.</t>
</list></t>
<t>While executing each individual step may be considered straightforward, any configuration task involving five non-trivial human mediated tasks is liable to be error prone. Moreover maintaining the configuration represents an ongoing maintenance effort as certificates expire, network configurations are changed, servers are updated, etc. </t>
</section>
<section title="Automating network management. " anchor="Section_2_2">
<t>In the traditional administration model the human is required to anticipate the needs of the server. Yet the server itself knows its needs with great precision although not necessarily how they are to be realized. </t>
<t>A server that is configured to use the TLS protocol knows that a certificate is required and the purposes for which it is to be used. It knows when the certificate is about to expire and requires replacement and when evidence of certificate status (e.g. an OCSP token) requires renewal. </t>
<t>Network configuration raises similar considerations except that the information available to a server is typically insufficient to perform network configuration tasks. It is not guaranteed that the local network IP address of a server is the same as the IP address that is visible to the external network. A mechanism in which the server edits DNS entries directly is therefore less functional than one in which the DNS entries are generated by a mediated service that has access to the necessary additional data. </t>
<t>Network configuration is an administration function and therefore requires administrative privileges. Accordingly, every OmniPublish request and response is authenticated using credentials established using the SXS-Connect protocol [I-D.hallambaker-wsconnect]. </t>
<section title="Cloud Computing Requirements. " anchor="Section_2_2_1">
<t>Cloud computing does not necessarily raise new management requirements but the requirements that are raised become more urgent. In the traditional model a service ran on a fixed number of hosts in a configuration that was static for months or years. In a cloud computing environment the number of hosts supporting a service might vary several times in an hour to respond to variations in load. </t>
<t>An important consequence of the transient nature of cloud computing is that hosts which provide a service for a few hours or even minutes are issued cryptographic credentials that are valid for a year. </t>
</section>
</section>
</section>
<section title="Omnibroker Publication Service " anchor="Section_3">
<t>The OmniPublish service is designed to permit services to manage themselves to the greatest extent possible. </t>
<t>The features that are most likely to make deployment attractive in the short term are the ability to manage cryptographic credentials including acquisition of public/private keypairs, certificates and certificate status assertions. </t>
<t>An enterprise with a large in-house IT department would typically host the Omnipublish service locally. The local service would then be configured to forward publication data to any IT facitilities that happen to be outsourced such as CA services, DNS etc. </t>
<t>A similar model may be applied in the home automation environment with devices under management publishing their service information to the local publication server which then forwards the information to external services as necessary. The chief difference between this case and the enterprise case being that the service operation cannot depend on the end user being aware that the device exists, let alone perform configuration. </t>
<t>In a pure cloud computing environment the OmniPublish service would have to be outsourced since there is no internal IT system for it to run off. </t>
<section title="Service Binding " anchor="Section_3_1">
<t>Application establishes a service connection to the OmniPublish service. </t>
</section>
<section title="Acquiring Cryptographic Credentials " anchor="Section_3_2">
<t>One of the chief reasons given for not using cryptographic protocols such as IPSEC, S/MIME and TLS is the difficulty of obtaining or registering the necessary cryptographic credentials. In the case of an Internet protocol this is typically but not always a PKIX certificate bound to a private key held by the the certificate subject. </t>
<section title="Example: Small Web Site Operator" anchor="Section_3_2_1">
<t>Alice is the owner of a small business that operates a Web site. To protect the privacy of the Web site users, Alice decides to enable TLS on the Web site. Accordingly, Alice selects a Certificate Authority Example CA Inc. that issues a certificate with an appropriate validation requirement for her intended use. </t>
<t>Alice provides her contact details to the CA which returns an account identifier alice@example.net and a PIN value [TBS]. </t>
<t>The credentials are immediately valid for creating a service connection using the PIN. The Service Connection Ticket is obtained by a Web Server administration tool: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/sxs-connect/ HTTP/1.1
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Host: localhost:8080
Content-Length: 344
Expect: 100-continue

{
  "OpenPINRequest": {
    "Encryption": ["A128CBC",
      "A256CBC",
      "A128GCM",
      "A256GCM"],
    "Authentication": ["HS256",
      "HS384",
      "HS512",
      "HS256T128"],
    "Account": "alice",
    "Service": ["omni-publish"],
    "Domain": "example.net",
    "HaveDisplay": false,
    "Challenge": "
4m7Lzr7g2FzllXcVGeDIOw"}}
]]></artwork>
</figure>
<t>The service responds with the challenge to be used to validate the PIN: </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 281 Pin code required
Content-Length: 511
Date: Wed, 21 May 2014 20:05:54 GMT
Server: Microsoft-HTTPAPI/2.0

{
  "OpenPINResponse": {
    "Status": 281,
    "StatusDescription": "Pin code required",
    "Challenge": "
cHbxV3Uwkb-CYezJhKj-wA",
    "ChallengeResponse": "
98RV4Se7VQIP3FbqcrLKyUth5u6F48dbCGpzrHpkGfQ",
    "Cryptographic": {
      "Secret": "
e6oSWl3dFfNkpYXvSTvY1w",
      "Encryption": "A128CBC",
      "Authentication": "HS256",
      "Ticket": "
V8ae-8uQMtt_uyKJQLbx4umJEpsz--OXVriEHRoq5sw5uq6u1_4tWv8ro7DyD5Su
hSpOibX2cOnd0OHSOJpcA1Gs9WjRArqzz0WrD0Inl39d89zbcWoMKYKhlOFFV_LF
V8kPPoK8BmaQOxCo3kBrxg"}}}
]]></artwork>
</figure>
<t>The administration tool completes the request by proving knowledge of the PIN: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/sxs-connect/ HTTP/1.1
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Session: Value=J5wXEchUbr7k2A0mvaOEPnr3KGFagzg1vH_MX6W1R14;
  Id=V8ae-8uQMtt_uyKJQLbx4umJEpsz--OXVriEHRoq5sw5uq6u1_4tWv8ro7Dy
  D5SuhSpOibX2cOnd0OHSOJpcA1Gs9WjRArqzz0WrD0Inl39d89zbcWoMKYKhlOF
  FV_LFV8kPPoK8BmaQOxCo3kBrxg
Host: localhost:8080
Content-Length: 129
Expect: 100-continue

{
  "TicketRequest": {
    "Service": ["omni-publish"],
    "ChallengeResponse": "
49GCx5HUvU2SNE6M3GuKcxgFfvZKDLpTfpqXUOAGXVE"}}
]]></artwork>
</figure>
<t>The Connection service returns the OmniPublish connection parameters: </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 OK Success
Content-Length: 1306
Date: Wed, 21 May 2014 20:05:54 GMT
Server: Microsoft-HTTPAPI/2.0

{
  "TicketResponse": {
    "Status": 200,
    "StatusDescription": "Success",
    "Cryptographic": [{
        "Protocol": "sxs-connect",
        "Secret": "
DOdZw6ynGANAjqnR-1gL0A",
        "Encryption": "A128CBC",
        "Authentication": "HS256",
        "Ticket": "
Ay9sUcNcC0GH9cY5NiRFcrqjFL0wTgTn69uO9SUPvP_XqB05yJ_fLqeI622H-bBu
klDhb1TpUGwQMAgNNwRkgsu97Dc38WBfUiyetM0TwYY"}],
    "Service": [{
        "Service": "omni-publish",
        "Name": "localhost",
        "Port": 8080,
        "Priority": 100,
        "Weight": 100,
        "Transport": "HTTP",
        "Cryptographic": {
          "Secret": "
LfRHVDFWVkVQu81lI2wT8w",
          "Encryption": "A128CBC",
          "Authentication": "HS256T128",
          "Ticket": "
OufJWkZCHmCLVeSuS4Nth4ozUrRfyDa4v8Dd5FIrkIWPQrGnHLgG_6ZmoHQGqIRg
7BL7Gm9Jq7LQihkCLhgQjp1LJqpDmDuDFbH5ZRDl7_g"}},
      {
        "Service": "omni-publish",
        "Name": "localhost",
        "Port": 9090,
        "Priority": 100,
        "Weight": 100,
        "Transport": "UDP",
        "Cryptographic": {
          "Secret": "
elODZJePf2UDWW1hHw2-3A",
          "Encryption": "A128CBC",
          "Authentication": "HS256T128",
          "Ticket": "
xMn4JDCQIg9WSHTVh1HwdJQq1iBoIHNk-BRHdhq_WGGeWv6cgfDgLYo2-U4BX2IH
_SRzZ1fDf5dHzfE67wuPawutwOkemJNH4mOK0XYeNPc"}}]}}
]]></artwork>
</figure>
<t>The administration tool enters the connection parameters into the server configuration data. At this point all the administrative tasks related to the server are complete and the remainder of the process can be performed automatically. </t>
<t>The server begins the process by generating a public key pair and Certificate Signing Request [RFC2986] and requests issue of a certificate with a CredentialRequest: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/omni-publish/ HTTP/1.1
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Session: Value=ArwY9yiAOaMjxTx4jE_BzNTNJ5z4Nn-I6gjdZPC5ejI;
  Id=OufJWkZCHmCLVeSuS4Nth4ozUrRfyDa4v8Dd5FIrkIWPQrGnHLgG_6ZmoHQG
  qIRg7BL7Gm9Jq7LQihkCLhgQjp1LJqpDmDuDFbH5ZRDl7_g
Host: localhost:8080
Content-Length: 148
Expect: 100-continue

{
  "CredentialRequest": {
    "Authentication": {
      "ContentType": "application/pkcs-10",
      "Data": "
AQID"},
    "MakePrivateKey": false}}
]]></artwork>
</figure>
<t>The service accepts the request but the process cannot be completed until the validation process required for the class of certificate has been completed. Accordingly the service returns the status 'Pending' and gives an estimated completion time: </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 282 Transaction Incomplete
Content-Length: 98
Date: Wed, 21 May 2014 20:05:55 GMT
Server: Microsoft-HTTPAPI/2.0

{
  "CredentialResponse": {
    "Status": 282,
    "StatusDescription": "Transaction Incomplete"}}
]]></artwork>
</figure>
<t>The validation process completes successfully and the CA issues the certificate. The server requests delivery of the certificate by repeating the CredentialRequest: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/omni-publish/ HTTP/1.1
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Session: Value=ArwY9yiAOaMjxTx4jE_BzNTNJ5z4Nn-I6gjdZPC5ejI;
  Id=OufJWkZCHmCLVeSuS4Nth4ozUrRfyDa4v8Dd5FIrkIWPQrGnHLgG_6ZmoHQG
  qIRg7BL7Gm9Jq7LQihkCLhgQjp1LJqpDmDuDFbH5ZRDl7_g
Host: localhost:8080
Content-Length: 148
Expect: 100-continue

{
  "CredentialRequest": {
    "Authentication": {
      "ContentType": "application/pkcs-10",
      "Data": "
AQID"},
    "MakePrivateKey": false}}
]]></artwork>
</figure>
<t>This time the certificate is ready and is returned to the server. For the convenience of the server software, the response message tells the Web server when the certificate will expire and the earliest and latest dates on which to request renewal: </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 282 Transaction Incomplete
Content-Length: 98
Date: Wed, 21 May 2014 20:05:55 GMT
Server: Microsoft-HTTPAPI/2.0

{
  "CredentialResponse": {
    "Status": 282,
    "StatusDescription": "Transaction Incomplete"}}
]]></artwork>
</figure>
<t>Note that the certificate returned is a short lifetime certificate that is only valid for a 72 hour interval, 24 hours of which have already elapsed at issue time. Use of short lived certificates is generally accepted as being highly desirable as it eliminates the need for certificate status reporting. The certificates issued will expire at the same time that any static status report would. The chief objection to the use of short lived certificates has been the need for daily administrative intervention. Automating the process of updating the certificate eliminates this objection. </t>
<t>In addition to eliminating the need to track revocation status separately, performing certificate updates on a daily basis is potentially more reliable than one that is only activated once a year. Network changes that prevent a an update completing successfully have immediate impact at a time the network administration is looking for potential problems rather than being discovered up to a year later when the personel who caused the change may have been reassigned or left the company. </t>
<t>The server MAY apply for renewal of the certificate at any time after the earliest date specified in the issue statement. If no request is made by the time that the latest time has been reached, the issuing CA MAY begin attempting to contact their customer to determine the cause. To avoid unnecessary warning messages from the CA (and possibly additional invoices for unused services) the server may inform the CA that certificate updates will not be required for an extended period using the Notify method: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/omni-publish/ HTTP/1.1
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Session: Value=wFsqI6wkH-TuCyGkIOjL3TJsbkvJCXxdHGohugk0hx0;
  Id=vVuUnw2Pi0xlHB2OFnbOBTDmLn9qC1HhEjUkJMHfCtBZRCPXc1GzPw8TLm1b
  8asS-GCtD8H681WvoGW0DcEgNMDUc0UZu-ZPo_wA9f8f-bk
Host: localhost:8080
Content-Length: 129
Expect: 100-continue

{
  "NotifyRequest": {
    "NextState": "Offline",
    "Earliest": "2014-05-21T20:05:56Z",
    "Latest": "2014-05-21T20:06:56Z"}}
]]></artwork>
</figure>
</section>
<section title="Example: Large Enterprise" anchor="Section_3_2_2">
<t>Since Alice only operates one Web server, the simplest management solution for her is for the Web server to establish a direct connection to the CA. In a large enterprise with several hundred servers, a centralized management approach which allows configurations to be applied to groups of servers as a unit is usually required. </t>
<t>To support this configuration, Bob deploys a local OmniPublish service in his network. Every machine that Bob manages connects to his local OmniPublish service to obtain its cryptographic credentials. The local OmniPublish service connects to the OmniPublish service of the CA to these service requests: </t>
<figure>
<artwork>
<![CDATA[+----------+
| Machine 1|--+
+----------+  |
              |
+----------+  |   +----------+           +----------+
| Machine 2|--+-->| Local OP |---------->|  CA OP   |
+----------+  |   +----------+           +----------+
              |
+----------+  |
| Machine 3|--+
+----------+]]></artwork>
</figure>
</section>
</section>
<section title="Generating or Obtaining a Public/Private KeyPair. " anchor="Section_3_3">
<t>Conventional wisdom holds that public/private key pairs should be generated on the host on which they are to be used and exist in no other location. </t>
<t>In practice, this mode of operation is not always the most desirable. In the case of keypairs to be used for encryption of static data, the decryption key must be available to all the machines that need decryption capabilities. </t>
<t>Key generation procedures for public key algorithms can be lengthy. While a delay of a few seconds or even a few minutes is acceptable in a one-time server configuration process, introducing such a delay into server startup is frequently unacceptable. </t>
<t>Experience of operating cryptographic systems has proved that correct and secure implementation of key generation capabilities is beyond the capabilities of many programmers. Random seeds are frequently generated with insufficient entropy. In some cases entropy is leaked after the seed is used to generate the private key. </t>
<t>For the above reasons, it is frequently but not always desirable to perform generation of public/private keypairs as a centralized service supported by a small number of machines that can be tightly controlled an audited. </t>
<section title="Example: Internet Coffee Pot " anchor="Section_3_3_1">
<t>Bob buys a new coffee pot for his office that supports the hypothetical 'Ready to Brew' Web Service that allows the machine to be instructed to brew a cup of fresh coffee. Since this is an important and security sensitive function, the coffee pot supports use of the TLS protocol but the control hardware does not have access to a suitible source of randomness for generating a public keypair. </t>
<t>To meet this need the coffee pot simply requests that the OmniPublish service generate a keypair on its behalf and return the private key with the certificate. Note that since Bob has bound the coffee pot to his local omnibroker service rather than a service provided by a public CA, Bob still exercises full control over generation of public/private keypairs. He is simply choosing to generate the keypair in a different place. </t>
<t>[TBS: provide a DH exchange to enable an application level guarantee that the private key is delivered under a sound encryption scheme] </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/omni-publish/ HTTP/1.1
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Session: Value=tKs0Y7AGoqfFtZDIUh395TlbIU2E6ciO2beA4lnBtgs;
  Id=vVuUnw2Pi0xlHB2OFnbOBTDmLn9qC1HhEjUkJMHfCtBZRCPXc1GzPw8TLm1b
  8asS-GCtD8H681WvoGW0DcEgNMDUc0UZu-ZPo_wA9f8f-bk
Host: localhost:8080
Content-Length: 147
Expect: 100-continue

{
  "CredentialRequest": {
    "Authentication": {
      "ContentType": "application/pkcs-10",
      "Data": "
AQID"},
    "MakePrivateKey": true}}
]]></artwork>
</figure>
<t>The service accepts the request and returns the requested credentials: </t>
<figure>
<artwork>
<![CDATA[HTTP/1.1 OK Success
Content-Length: 3426
Date: Wed, 21 May 2014 20:05:55 GMT
Server: Microsoft-HTTPAPI/2.0

{
  "CredentialResponse": {
    "Status": 200,
    "StatusDescription": "Success",
    "Credential": {
      "ContentType": "application/pkix-cert",
      "Data": "
eA0QIvK3hMNUo3d8IxEchavHUltR5O1LUmEnLCcpGL3XROcD_3GtNpvEWgexojbi
By4SynEEzCGpRzyFoioPB1Fk2yrA_c74YxRYc4OuFryF9CgrbshEMHi-I9Szip1i
Lr6_NDwifiMAUH4KZEwj6TyVCh0zMHWtYY6T_itwdbZhOdxsSxITn4xBEUEzQs3w
mSJ5pRbhguaotJ_Vexv87eYlmn-nKrh9w99hVsNFWm2pVmWMgMF__Q_xGWpf4y_Z
S4Bko6jpHqY6MA_JjSBxrKXP2FG1JNCe-10I1Oohdtt7z3i1pi9nYb0opPL1pmj2
6uXHRYO8hy0oewXEdHP_zg"},
    "Support": [{
        "ContentType": "application/pkix-cert",
        "Data": "
4IvLI64hE-6_UxpMD_GUkyJLjGlq3Hz9i7G8kOJkn6kSjqyWmy_MGLN57dDGnK7D
z9DJYjSHbPk6SaX3r6_ye5YSxyuVF2duQACtH4Bd3icq_QpfiuXB-l8c5QTJe60u
ZZgVsGhzpagNpIUEb4VlPVIuQ4ZdV-yxLWhYM28ibzhHMfxNo6YOw-Xa7ySujry4
kr-ojsARBcS6jys6-k0_KUH8WPkIeiBisNQI7c4IwhgCE1DJqZRfIEB4fTjLWV3-
frOuuY6Y1cz_whODCgn68phD2D6eFuPyiJncU6WrFxF_aQibTQ9C7C61SWtloM5r
ASUBjY-bD9_iCppEtHxzoA"},
      {
        "ContentType": "application/pkix-cert",
        "Data": "
LP9gFTTrsaeA_y9GqH_3eNiIbVR6H3HPhEIgu0UlWIKQoy_PeQB3JsOCd5O2Ra2S
HnPBMG4aRCVBU8MOTk27L9t4jvHbIy0kC0Ja4hm5yedkcG8sPhFZkHIOmhLhuaNT
bdLWFIUkvus420fl6gw1DU9n1H9vCbxG21SXet7iEhXQ9e8tA_i_9046NuS1CwTG
kpX0JJqrHHiZ6GQ3kKcn5PAdZkWiMAHReSATeD8GblAwXCkvguvVodMRV84n7gp4
JMuUnpKbtpZ_x0ycbG6LhwjmXyT_GzAYtjmSFXsS1shzNkmTYLbus1QFDVWaVPFk
AFwfthWawhaYBj0JWiAA0A"},
      {
        "ContentType": "application/pkix-cert",
        "Data": "
DInUnJXe53hXiwrrWEyZPOlKsjzEYnhN_eVIGkArTjR9L7WQ32jY1Mt6sfnQsYiM
cRfqANQd3tVLRKnyNQYJaU1MkNmOC7OLSLbWW4XBFxQaCk__T0IoDMxTP4Ol0uUW
EVo47OkUMnteOQ21qhBBW415fB2S_WN-UdB3ILzW8jfdNPVy1ctn5XjcaV_WfTPY
goUCtuJbULrB17LzmAYkNTdIny2uQs6vO8kogQH1jTw0WYb24NB_iO0tIw8gwRXb
iVb3cKH46ywNq4B2BjVcQw5UE_-Q-FMfArKTGg7Z0Oobg3VeOuX_3tC1_wRmnZjy
lGLHTGi5yU5nOVranbCuIQ"},
      {
        "ContentType": "application/ocsp-response",
        "Data": "
iyqwOV3TFQE7e0KIPgtDZ0_rMPZSB0rnSBjII_07JwuJjPYpBv6R8U6uK4vJwHOy
mxCBQLwa8ZQf9wLUAXwaz1H0bN7vKRZgIoZsTrT96KHRVj1i867zS70ZZg0nH9X9
1dwuv_n7KUEmwoUqFX4x9B2Ug3z1TPv-iLjkpPyWz4g"},
      {
        "ContentType": "application/ocsp-response",
        "Data": "
BYAKOKAi9fD3tni3pUKZxHfiBv0ICo9ULKBMiwPOGpGRVomwuawD-D-P4uDnEvXS
3mSa3fQ_fz2tw7fOCMrG3n16Yj0NCc4X8GHn49hRRTfzywsgybTxMitgSrXGh4us
Qao5gsnlR-Zo4oT2I1wWP1P9CrJY3KcGrSPpu40HD-4"},
      {
        "ContentType": "application/ocsp-response",
        "Data": "
MqSNwx7iFJomrYmB6bo600I5rbEchtbQrkzyBZt7ZW79RI1NRZMN9tkYif4b_Gby
QNLNk3eY6WhooU7Yl9boIoQYas-SY7s8Njp4gQmIjk2nPNKNNn2qtrVbfYRtxEIg
Nm3zJy9CtdyU87zQxXG-oG29FBG-hAQjmNtEes4xgtU"},
      {
        "ContentType": "application/ocsp-response",
        "Data": "
J5vbsOlkSk4S7CasMzjQOW5C4QXJXjztHP_MaGMvWF0C4CQxZkn_6lmIENuro2gv
ew3LTTvAv4ljESkcBP1iT7fGcQBE621ZO_8_RLn8XtDFmUyWvayguhvuhp4mwuL4
fFYXvwdWWVt_15X1HL1uCaOyXA88SQpjpxGN8ZuAtBc"},
      {
        "ContentType": "application/pkcs-12",
        "Data": "
PUu_AzFikCBEYq1jB4d5pxCEsnvhq9iW4sXwf--3E8n-qr7HPEWXU2HWqtTjXA0E
1NQDWhJrxFM-o-EK1_gVGXKuSaGjndRVUm1p0ec-Vb5C5EBD4a0509ky0JaT1iMT
O-sCgBWkfHd-SOjSCbZxpTVZX_na3M0D12uoKCRDJcc39bDWebKrw3IEoJPFbuEn
PzGMmoYcs6cVpSl18BCj6t6-rZTSyIVk11NBuhZZ8CotbmdcqKs4_ORaufBgzNzd
o9rE-84MCBh-H3IkNZTuuakWOngdgSPkiOUuDd7k7YK-JNXwpDFWJeTiNxJiLOKE
vzPo8alcstgdnnb9dVu6uIz_-SXNMj7L5N3iuNRx8ZgWIaCVRDes6HuLqnEZXL-a
B1ZxUUvTPs-DUoNndpjsy5k5T1lwLuw7zCevqEBkxb1WpX4T8QBlDpLq1xjxW7tC
LUJyrCTRNrAP2t0OMo8z32_V3UZ5Qd5dwTELCfMqUAbDj9dZsKK4mhcdE6hArkr0
_XkzrIcL"}]}}
]]></artwork>
</figure>
</section>
</section>
<section title="Request Network Configuration " anchor="Section_3_4">
<t>Configuring a network server typically requires an administrator to perform several tasks: </t>
<t><list style="symbols">
<t>Assign an IP address to the server.</t>
<t>Configure the firewall to accept incomming traffic and direct it to the server.</t>
<t>Assign a DNS address to the server.</t>
<t>Configure the server to accept connections at the chosen DNS address.</t>
<t>Configure the relevant authoritative DNS server to publish the server records for the chosen DNS address.</t>
<t>Update local LDAP directories.</t>
</list></t>
<t>While each individual step is straightforward, any error or inconsistency introduced may cause the configuration to fail or worse, succeed unreliably. Diagnosing and correcting such errors is one of the principal challenges in network administration. </t>
<t>Delegating responsibility for the network configuration to a service enables the configuration to be performed automatically and separates the configuration of the network from the configuration of the servers and services that use the network. This approach greatly simplifies deployment of complex network changes and makes major changes possible without interruption of service. </t>
<section title="Example: Coffe Pot Service Registration." anchor="Section_3_4_1">
<t>Having deployed an infrastructure to automate management of his PKI credentials, Bob can leverage the same infrastructure to automate network configuration tasks as well. </t>
<t>The coffee pot establishes a service connection using the out of band authentication technique described in [I-D.hallambaker-wsconnect]. Having established the service connection, the coffee pot requests advertisement of the brew-coffee Web service as follows: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/omni-publish/ HTTP/1.1
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Session: Value=cWUCjw6DTbyS8o1jkKSfLsJWb_8icI_HTb1Tpb80FJo;
  Id=vVuUnw2Pi0xlHB2OFnbOBTDmLn9qC1HhEjUkJMHfCtBZRCPXc1GzPw8TLm1b
  8asS-GCtD8H681WvoGW0DcEgNMDUc0UZu-ZPo_wA9f8f-bk
Host: localhost:8080
Content-Length: 313
Expect: 100-continue

{
  "AdvertiseRequest": {
    "Service": [{
        "Identifier": [{
            "Name": "Example.com",
            "Service": "_make_coffee._wks."}],
        "Connection": {
          "IPAddress": "10.1.2.3",
          "IPPort": 666,
          "Transport": "TLS",
          "TransportPolicy": "TLS=Required"}}]}}
]]></artwork>
</figure>
<t>The advertisement request succeeds and the OmniPublish service reports the successful outcome: </t>
<figure>
<artwork>
<![CDATA[POST /.well-known/omni-publish/ HTTP/1.1
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Session: Value=cWUCjw6DTbyS8o1jkKSfLsJWb_8icI_HTb1Tpb80FJo;
  Id=vVuUnw2Pi0xlHB2OFnbOBTDmLn9qC1HhEjUkJMHfCtBZRCPXc1GzPw8TLm1b
  8asS-GCtD8H681WvoGW0DcEgNMDUc0UZu-ZPo_wA9f8f-bk
Host: localhost:8080
Content-Length: 313
Expect: 100-continue

{
  "AdvertiseRequest": {
    "Service": [{
        "Identifier": [{
            "Name": "Example.com",
            "Service": "_make_coffee._wks."}],
        "Connection": {
          "IPAddress": "10.1.2.3",
          "IPPort": 666,
          "Transport": "TLS",
          "TransportPolicy": "TLS=Required"}}]}}
]]></artwork>
</figure>
<t>In this instance the OmniPublish service has granted the coffee pot a 48 hour lease on the service advertisement which must be renewed before expiry. In this case the publication request requires updates to the DNS service which will take some time to propagate. An estimate of the time required to complete publication is returned. </t>
</section>
</section>
</section>
<section title="OBPPublish" anchor="Section_4">
<t>The OmniPublish protocol is a Web service that a network service or peer calls as a client to advertise the availability of a service and to obtain necessary cryptographic credentials. </t>
<section title="OBPPublish Transactions" anchor="Section_4_1">
<section title="Advertise" anchor="Section_4_1_1">
<t><list style="symbols">
<t>Request: AdvertiseRequest</t>
<t>Response: AdvertiseResponse</t>
</list></t>
<t>Advises a broker that one or more Internet services are being offered with particular attributes. </t>
</section>
<section title="Credential" anchor="Section_4_1_2">
<t><list style="symbols">
<t>Request: CredentialRequest</t>
<t>Response: CredentialResponse</t>
</list></t>
<t>Request issue of a cryptographic credential and (optionally) generate a public keypair </t>
</section>
<section title="Notify" anchor="Section_4_1_3">
<t><list style="symbols">
<t>Request: NotifyRequest</t>
<t>Response: NotifyResponse</t>
</list></t>
<t>Notify the publication service that a server state transition has occurred or is planned. </t>
</section>
</section>
<section title="OBPPublish Messages" anchor="Section_4_2">
<section title="Message: PResponse" anchor="Section_4_2_1">
<t>Every Query Response contains the following common elements: </t>
<t><list style="hanging">
<t hangText="Status :">Integer [1..1] Status return code value </t>
<t hangText="StatusDescription :">String [0..1] Describes the status code (ignored by processors) </t>
</list></t>
</section>
<section title="Message: AdvertiseRequest" anchor="Section_4_2_2">
<t>Specifies the connection(s) to be established. </t>
<t>The attributes required depend on the infrastructure(s) that the broker is capable of registering the service with. </t>
<t><list style="hanging">
<t hangText="Service :">OBPQuery.Service [0..Many] Describes a connection to be established. </t>
</list></t>
</section>
<section title="Message: AdvertiseResponse" anchor="Section_4_2_3">
<t>Specifies the connection(s) </t>
<t><list style="hanging">
<t hangText="Status :">Integer [1..1] Status return code value </t>
<t hangText="StatusDescription :">String [0..1] Describes the status code (ignored by processors) </t>
<t hangText="Service :">OBPQuery.Service [0..Many] Describes a connection that was established. </t>
</list></t>
</section>
<section title="Message: CredentialRequest" anchor="Section_4_2_4">
<t>Request issue of a cryptographic credential and (optionally) generate a public keypair. </t>
<t><list style="hanging">
<t hangText="SubjectIdentifier :">String [0..1] The DNS domain or [!RFC2822] account for which the credential is requested. </t>
<t hangText="Authentication :">TaggedBinary [0..1] Data required by the credential issuer to authenticate the request. For example a Certificate Signing Request [!RFC2986]. </t>
<t hangText="MakePrivateKey :">Boolean [0..1] If true, requests that a private keypair be generated and the private component returned to the requestor. </t>
<t hangText="ResponseTypes :">String [0..Many] Types of data requested in response. </t>
</list></t>
</section>
<section title="Message: CredentialResponse" anchor="Section_4_2_5">
<t>Returns issued cryptographic credentials. </t>
<t><list style="hanging">
<t hangText="Status :">Integer [1..1] Status return code value </t>
<t hangText="StatusDescription :">String [0..1] Describes the status code (ignored by processors) </t>
<t hangText="Credential :">TaggedBinary [0..1] The requested credential type, typically a PKIX End Entity certificate. </t>
<t hangText="Support :">TaggedBinary [0..Many] Supporting data for the issued credential. For example one or more chains of certificate signing certificates, OCSP [!RFC6960] tokens etc. </t>
<t hangText="SecretKey :">TaggedBinary [0..1] The secret key for the requested credential (if requested). </t>
<t hangText="Expires :">DateTime [0..1] The time at which the credential will cease to be accepted by relying parties. </t>
<t hangText="EarliestRenewal :">DateTime [0..1] The earliest time at which the issuer will accept renewal. </t>
<t hangText="LatestRenewal :">DateTime [0..1] The latest time at which the issuer suggests requesting renewal. </t>
</list></t>
</section>
<section title="Message: NotifyRequest" anchor="Section_4_2_6">
<t><list style="hanging">
<t hangText="CurrentState :">String [0..1] Current state of the requestor </t>
<t hangText="NextState :">String [0..1] State that the Requestor plans to enter </t>
<t hangText="Earliest :">DateTime [0..1] Earliest time at which the transition is expected to complete </t>
<t hangText="Latest :">DateTime [0..1] Latest time at which the transition is expected to complete </t>
</list></t>
</section>
<section title="Message: NotifyResponse" anchor="Section_4_2_7">
<t><list style="hanging">
<t hangText="Status :">Integer [1..1] Status return code value </t>
<t hangText="StatusDescription :">String [0..1] Describes the status code (ignored by processors) </t>
</list></t>
</section>
</section>
<section title="OBPPublish Structures" anchor="Section_4_3">
<section title="Structure: TaggedBinary" anchor="Section_4_3_1">
<t>A sequence of values of the same type. </t>
<t><list style="hanging">
<t hangText="ContentType :">String [0..1] MIME Content Type of Data </t>
<t hangText="Data :">Binary [0..1] Opaque binary data </t>
</list></t>
</section>
</section>
</section>
<section title="Transport Bindings and Identifiers" anchor="Section_5">
<t>The transport binding options for Omnibroker Publication are identical to those offered for Omnibroker Discovery [I-D.hallambaker-omnibroker].</t>
<section title="Content-Type Identifiers" anchor="Section_5_1">
<t>The following content identifiers are defined elsewhere and repeated here for the convenience of implementers. </t>
<t><list style="hanging">
<t hangText="application/ocsp-response ">OCSP Response token as specified in [!RFC6090]. </t>
<t hangText="application/pkix-cert">A single DER encoded PKIX Certificate as specified in [!RFC5280]. </t>
<t hangText="TBS">A Certificate Transparency notary chain as specified in [~RFC6962]. </t>
<t hangText="application/pkcs-12">A PKCS#12 encrypted private key.</t>
</list></t>
</section>
</section>
<section title="Acknowledgements" anchor="Section_6">
<t>Rob Stradling, Robin Alden... </t>
</section>
<section title="Security Considerations" anchor="Section_7">
<section title="Denial of Service" anchor="Section_7_1">
</section>
<section title="Breach of Trust" anchor="Section_7_2">
</section>
<section title="Coercion" anchor="Section_7_3">
</section>
</section>
<section title="IANA Considerations" anchor="Section_8">
<t>[TBS list out all the code points that require an IANA registration] </t>
</section>
</middle>
<back>
<references title="Normative References">
<reference anchor="RFC2119">
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname="Scott Bradner" initials="S." surname="Bradner">
<organization>Harvard University</organization>
<address>
</address>
</author>
<date month="March" year="1997"/>
<keyword>keyword</keyword>
</front>
<seriesInfo name="BCP" value="14"/>
<seriesInfo name="RFC" value="2119"/>
<format type="TXT" target="http://www.rfc-editor.org/rfc/rfc2119.txt" octets="4723"/>
<format type="HTML" target="http://xml.resource.org/public/rfc/html/rfc2119.html" octets="17970"/>
<format type="XML" target="http://xml.resource.org/public/rfc/xml/rfc2119.xml" octets="5777"/>
</reference>
<reference anchor="I-D.hallambaker-omnibroker">
<front>
<title>OmniBroker Protocol</title>
<author fullname="Phillip Hallam-Baker" initials="P" surname="Hallam-Baker">
<organization/>
<address>
</address>
</author>
<date day="21" month="January" year="2014"/>
</front>
<seriesInfo name="Internet-Draft" value="draft-hallambaker-omnibroker-07"/>
<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-hallambaker-omnibroker-07.txt"/>
<format type="PDF" target="http://www.ietf.org/internet-drafts/draft-hallambaker-omnibroker-07.pdf"/>
</reference>
<reference anchor="I-D.hallambaker-wsconnect">
<front>
<title>JSON Service Connect (JCX) Protocol</title>
<author fullname="Phillip Hallam-Baker" initials="P" surname="Hallam-Baker">
<organization/>
<address>
</address>
</author>
<date day="21" month="January" year="2014"/>
</front>
<seriesInfo name="Internet-Draft" value="draft-hallambaker-wsconnect-05"/>
<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-hallambaker-wsconnect-05.txt"/>
<format type="PDF" target="http://www.ietf.org/internet-drafts/draft-hallambaker-wsconnect-05.pdf"/>
</reference>
<reference anchor="RFC2986">
<front>
<title>PKCS #10: Certification Request Syntax Specification Version 1.7</title>
<author fullname="M. Nystrom" initials="M." surname="Nystrom">
<organization/>
<address>
</address>
</author>
<author fullname="B. Kaliski" initials="B." surname="Kaliski">
<organization/>
<address>
</address>
</author>
<date month="November" year="2000"/>
</front>
<seriesInfo name="RFC" value="2986"/>
<format type="TXT" target="http://www.rfc-editor.org/rfc/rfc2986.txt" octets="27794"/>
</reference>
<reference anchor="RFC2822">
<front>
<title>Internet Message Format</title>
<author fullname="P. Resnick" initials="P." surname="Resnick">
<organization/>
<address>
</address>
</author>
<date month="April" year="2001"/>
</front>
<seriesInfo name="RFC" value="2822"/>
<format type="TXT" target="http://www.rfc-editor.org/rfc/rfc2822.txt" octets="110695"/>
</reference>
<reference anchor="RFC6960">
<front>
<title>X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP</title>
<author fullname="S. Santesson" initials="S." surname="Santesson">
<organization/>
<address>
</address>
</author>
<author fullname="M. Myers" initials="M." surname="Myers">
<organization/>
<address>
</address>
</author>
<author fullname="R. Ankney" initials="R." surname="Ankney">
<organization/>
<address>
</address>
</author>
<author fullname="A. Malpani" initials="A." surname="Malpani">
<organization/>
<address>
</address>
</author>
<author fullname="S. Galperin" initials="S." surname="Galperin">
<organization/>
<address>
</address>
</author>
<author fullname="C. Adams" initials="C." surname="Adams">
<organization/>
<address>
</address>
</author>
<date month="June" year="2013"/>
</front>
<seriesInfo name="RFC" value="6960"/>
<format type="TXT" target="http://www.rfc-editor.org/rfc/rfc6960.txt" octets="82037"/>
</reference>
<reference anchor="RFC6090">
<front>
<title>Fundamental Elliptic Curve Cryptography Algorithms</title>
<author fullname="D. McGrew" initials="D." surname="McGrew">
<organization/>
<address>
</address>
</author>
<author fullname="K. Igoe" initials="K." surname="Igoe">
<organization/>
<address>
</address>
</author>
<author fullname="M. Salter" initials="M." surname="Salter">
<organization/>
<address>
</address>
</author>
<date month="February" year="2011"/>
</front>
<seriesInfo name="RFC" value="6090"/>
<format type="TXT" target="http://www.rfc-editor.org/rfc/rfc6090.txt" octets="75993"/>
</reference>
<reference anchor="RFC5280">
<front>
<title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
<author fullname="D. Cooper" initials="D." surname="Cooper">
<organization/>
<address>
</address>
</author>
<author fullname="S. Santesson" initials="S." surname="Santesson">
<organization/>
<address>
</address>
</author>
<author fullname="S. Farrell" initials="S." surname="Farrell">
<organization/>
<address>
</address>
</author>
<author fullname="S. Boeyen" initials="S." surname="Boeyen">
<organization/>
<address>
</address>
</author>
<author fullname="R. Housley" initials="R." surname="Housley">
<organization/>
<address>
</address>
</author>
<author fullname="W. Polk" initials="W." surname="Polk">
<organization/>
<address>
</address>
</author>
<date month="May" year="2008"/>
</front>
<seriesInfo name="RFC" value="5280"/>
<format type="TXT" target="http://www.rfc-editor.org/rfc/rfc5280.txt" octets="352580"/>
</reference>
</references>
<references title="Informative References">
<reference anchor="RFC6962">
<front>
<title>Certificate Transparency</title>
<author fullname="B. Laurie" initials="B." surname="Laurie">
<organization/>
<address>
</address>
</author>
<author fullname="A. Langley" initials="A." surname="Langley">
<organization/>
<address>
</address>
</author>
<author fullname="E. Kasper" initials="E." surname="Kasper">
<organization/>
<address>
</address>
</author>
<date month="June" year="2013"/>
</front>
<seriesInfo name="RFC" value="6962"/>
<format type="TXT" target="http://www.rfc-editor.org/rfc/rfc6962.txt" octets="55048"/>
</reference>
</references>
</back>
</rfc>
