...

Text file src/github.com/letsencrypt/boulder/docs/DESIGN.md

Documentation: github.com/letsencrypt/boulder/docs

     1# Boulder flow diagrams
     2
     3Boulder is built out of multiple components that can be deployed in different
     4security contexts.
     5
     6In order for you to understand how Boulder works and ensure it's working correctly,
     7this document lays out how various operations flow through boulder. It is
     8expected you're already familiar with the [ACME
     9protocol](https://github.com/ietf-wg-acme/acme). We show a diagram of how calls
    10go between Boulder components, and provide notes on what each
    11component does to help the process along.  Each step is in its own subsection
    12below, in roughly the order that they happen in certificate issuance for both
    13ACME v1 and ACME v2.
    14
    15A couple of notes:
    16
    17* For simplicity, we do not show interactions with the Storage Authority.
    18  The SA simply acts as a common data store for the various components.  It
    19  is written to by the RA (registrations and authorizations) and the CA
    20  (certificates), and read by WFEv2, RA, and CA.
    21
    22* The interactions shown in the diagrams are the calls that go between
    23  components.  These calls are done via [gRPC](https://grpc.io/).
    24
    25* In various places the Boulder implementation of ACME diverges from the current
    26  RFC draft. These divergences are documented in [docs/acme-divergences.md](https://github.com/letsencrypt/boulder/blob/main/docs/acme-divergences.md).
    27
    28* The RFC draft leaves many decisions on it's implementation to the discretion
    29  of server and client developers. The ACME RFC is also silent on some matters,
    30  as the relevant implementation details would be influenced by other RFCs.
    31  Several of these details and decisions particular to Boulder are documented in [docs/acme-implementation_details.md](https://github.com/letsencrypt/boulder/blob/main/docs/acme-implementation_details.md).
    32
    33* We focus on the primary ACME operations and do not include all possible
    34  interactions (e.g. account key change, authorization deactivation)
    35
    36* We presently ignore the POST-as-GET construction introduced in
    37  [draft-15](https://tools.ietf.org/html/draft-ietf-acme-acme-15) and show
    38  unauthenticated GET requests for ACME v2 operations.
    39
    40## New Account/Registration
    41
    42ACME v2:
    43
    44```
    451: Client ---newAccount---> WFEv2
    462:                          WFEv2 ---NewRegistration--> RA
    473:                          WFEv2 <-------return------- RA
    484: Client <---------------- WFEv2
    49```
    50
    51Notes:
    52
    53* 1-2: WFEv2 does the following:
    54  * Verify that the request is a POST
    55  * Verify the JWS signature on the POST body
    56  * Parse the registration/account object
    57  * Filters illegal fields from the registration/account object
    58  * We ignore the WFEv2 possibly returning early based on the OnlyReturnExisting
    59    flag to simplify explanation.
    60
    61* 2-3: RA does the following:
    62  * Verify that the registered account key is acceptable
    63  * Create a new registration/account and add the client's information
    64  * Store the registration/account (which gives it an ID)
    65  * Return the registration/account as stored
    66
    67* 3-4: WFEv2 does the following:
    68  * Return the registration/account, with a unique URL
    69
    70
    71## Updated Registration
    72
    73ACME v2:
    74
    75```
    761: Client ---acct--> WFEv2
    772:                   WFEv2 ---UpdateRegistration--> RA
    783:                   WFEv2 <--------return--------- RA
    794: Client <--------- WFEv2
    80```
    81
    82* 1-2: WFEv2 does the following:
    83  * Verify that the request is a POST
    84  * Verify the JWS signature on the POST body
    85  * Verify that the JWS signature is by a registered key
    86  * Verify that the JWS key matches the registration for the URL
    87  * WFEv2: Verify that the account agrees to the terms of service
    88  * Parse the registration/account object
    89  * Filter illegal fields from the registration/account object
    90
    91* 2-3: RA does the following:
    92  * Merge the update into the existing registration/account
    93  * Store the updated registration/account
    94  * Return the updated registration/account
    95
    96* 3-4: WFEv2 does the following:
    97  * Return the updated registration/account
    98
    99## New Authorization (ACME v1 Only)
   100
   101ACME v2:
   102We do not implement "pre-authorization" and the newAuthz endpoint for ACME v2.
   103Clients are expected to get authorizations by way of creating orders.
   104
   105* 1-2: WFEv2 does the following:
   106  * Verify that the request is a POST
   107  * Verify the JWS signature on the POST body
   108  * Verify that the JWS signature is by a registered key
   109  * Verify that the client has indicated agreement to terms
   110  * Parse the initial authorization object
   111
   112* 2-3: RA does the following:
   113  * Verify that the requested identifier is allowed by policy
   114  * Verify that the CAA policy for for each DNS identifier allows issuance
   115  * Create challenges as required by policy
   116  * Construct URIs for the challenges
   117  * Store the authorization
   118
   119* 3-4: WFEv2 does the following:
   120  * Return the authorization, with a unique URL
   121
   122## New Order (ACME v2 Only)
   123
   124ACME v2:
   125```
   1261: Client ---newOrder---> WFEv2
   1272:                        WFEv2 -------NewOrder------> RA
   1283:                        WFEv2 <-------return-------- RA
   1294: Client <-------------- WFEv2
   130```
   131
   132* 1-2: WFEv2 does the following:
   133  * Verify that the request is a POST
   134  * Verify the JWS signature on the POST body
   135  * Verify that the JWS signature is by a registered key
   136  * Parse the initial order object and identifiers
   137
   138* 2-3: RA does the following:
   139  * Verify that the requested identifiers are allowed by policy
   140  * Create authorizations and challenges as required by policy
   141  * Construct URIs for the challenges and authorizations
   142  * Store the authorizations and challenges
   143
   144* 3-4: WFEv2 does the following:
   145  * Return the order object, containing authorizations and challenges, with
   146  a unique URL
   147
   148## Challenge Response
   149
   150ACME v2:
   151
   152```
   1531: Client ---chal--> WFEv2
   1542:                   WFEv2 ---UpdateAuthorization--> RA
   1553:                                                   RA ---PerformValidation--> VA
   1564: Client <~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~> VA
   1575:                                                   RA <-------return--------- VA
   1586:                   WFEv2 <--------return---------- RA
   1597: Client <--------- WFEv2
   160```
   161
   162* 1-2: WFEv2 does the following:
   163  * Look up the referenced authorization object
   164  * Look up the referenced challenge within the authorization object
   165  * Verify that the request is a POST
   166  * Verify the JWS signature on the POST body
   167  * Verify that the JWS signature is by a registered key
   168  * Verify that the JWS key corresponds to the authorization
   169
   170* 2-3: RA does the following:
   171  * Store the updated authorization object
   172
   173* 3-4: VA does the following:
   174  * Dispatch a goroutine to do validation
   175
   176* 4-5: RA does the following:
   177  * Return the updated authorization object
   178
   179* 5-6: WFEv2 does the following:
   180  * Return the updated authorization object
   181
   182* 6: VA does the following:
   183  * Validate domain control according to the challenge responded to
   184  * Notify the RA of the result
   185
   186* 6-7: RA does the following:
   187  * Check that a sufficient set of challenges has been validated
   188  * Mark the authorization as valid or invalid
   189  * Store the updated authorization object
   190
   191* 6-7: WFEv2 does the following:
   192  * Return the updated challenge object
   193
   194## Authorization Poll
   195
   196ACME v2:
   197
   198```
   1991: Client ---authz--> WFEv2
   2002: Client <---------- WFEv2
   201```
   202
   203* 1-2: WFEv2 does the following:
   204  * Look up the referenced authorization
   205  * Verify that the request is a GET
   206  * Return the authorization object
   207
   208## Order Poll (ACME v2 Only)
   209
   210ACME v1:
   211This version of the protocol does not use order objects.
   212
   213ACME v2:
   214
   215```
   2161: Client ---order--> WFEv2
   2172: Client <---------- WFEv2
   218```
   219
   220* 1-2: WFEv2 does the following:
   221  * Look up the referenced order
   222  * Return the order object
   223
   224## New Certificate (ACME v1 Only)
   225
   226ACME v2:
   227This version of the protocol expects certificate issuance to occur only through
   228order finalization and does not offer the new-cert endpoint.
   229
   230* 1-2: WFEv2 does the following:
   231  * Verify that the request is a POST
   232  * Verify the JWS signature on the POST body
   233  * Verify that the JWS signature is by a registered key
   234  * Verify that the client has indicated agreement to terms
   235  * Parse the certificate request object
   236
   237* 3-4: RA does the following:
   238  * Verify the PKCS#10 CSR in the certificate request object
   239  * Verify that the CSR has a non-zero number of domain names
   240  * Verify that the public key in the CSR is different from the account key
   241  * For each authorization referenced in the certificate request
   242    * Retrieve the authorization from the database
   243    * Verify that the authorization corresponds to the account key
   244    * Verify that the authorization is valid
   245    * Verify that the CAA policy for the identifier is still valid
   246  * Verify that all domains in the CSR are covered by authorizations
   247  * Compute the earliest expiration date among the authorizations
   248  * Instruct the CA to issue a precertificate
   249
   250* 3-4: CA does the following:
   251  * Verify that the public key in the CSR meets quality requirements
   252    * RSA only for the moment
   253    * Modulus >= 2048 bits and not divisible by small primes
   254    * Exponent > 2^16
   255  * Remove any duplicate names in the CSR
   256  * Verify that all names are allowed by policy (also checked at new-authz time)
   257  * Verify that the issued cert will not be valid longer than the CA cert
   258  * Verify that the issued cert will not be valid longer than the underlying authorizations
   259  * Open a CA DB transaction and allocate a new serial number
   260  * Sign a poisoned precertificate
   261
   262* 5-6: RA does the following:
   263  * Collect the SCTs needed to satisfy the ctpolicy
   264  * Instruct the CA to issue a final certificate with the SCTs
   265
   266* 5-6: CA does the following:
   267  * Remove the precertificate poison and sign a final certificate with SCTs provided by the RA
   268  * Create the first OCSP response for the final certificate
   269  * Sign the final certificate and the first OCSP response
   270  * Store the final certificate
   271  * Commit the CA DB transaction if everything worked
   272  * Return the final certificate serial number
   273
   274* 6-7: RA does the following:
   275  * Log the success or failure of the request
   276  * Return the certificate object
   277
   278* 7-8: WFEv2 does the following:
   279  * Create a URL from the certificate's serial number
   280  * Return the certificate with its URL
   281
   282## Order Finalization (ACME v2 Only)
   283
   284ACME v2:
   285
   286```
   2871: Client ---order finalize--> WFEv2
   2882:                       WFEv2 ----FinalizeOrder--> RA
   2893:                                                  RA ----------IssuePreCertificate---------> CA
   2904:                                                  RA <---------------return----------------- CA
   2915:                                                  RA ---IssueCertificateForPrecertificate--> CA
   2926:                                                  RA <---------------return----------------- CA
   2937:                       WFEv2 <----return--------- RA
   2948: Client <------------- WFEv2
   295```
   296
   297* 1-2: WFEv2 does the following:
   298  * Verify that the request is a POST
   299  * Verify the JWS signature on the POST body
   300  * Verify that the JWS signature is by a registered key
   301  * Verify the registered account owns the order being finalized
   302  * Parse the certificate signing request (CSR) from the request
   303
   304* 2-4: RA does the following:
   305  * Verify the PKCS#10 CSR in the certificate request object
   306  * Verify that the CSR has a non-zero number of domain names
   307  * Verify that the public key in the CSR is different from the account key
   308  * Retrieve and verify the status and expiry of the order object
   309  * For each identifier referenced in the order request
   310    * Retrieve the authorization from the database
   311    * Verify that the authorization corresponds to the account key
   312    * Verify that the authorization is valid
   313    * Verify that the CAA policy for the identifier is still valid
   314  * Verify that all domains in the order are included in the CSR
   315  * Instruct the CA to issue a precertificate
   316
   317* 3-4: CA does the following:
   318  * Verify that the public key in the CSR meets quality requirements
   319    * RSA only for the moment
   320    * Modulus >= 2048 bits and not divisible by small primes
   321    * Exponent > 2^16
   322  * Remove any duplicate names in the CSR
   323  * Verify that all names are allowed by policy (also checked at new-authz time)
   324  * Verify that the issued cert will not be valid longer than the CA cert
   325  * Verify that the issued cert will not be valid longer than the underlying authorizations
   326  * Open a CA DB transaction and allocate a new serial number
   327  * Sign a poisoned precertificate
   328
   329* 5-6: RA does the following
   330  * Collect the SCTs needed to satisfy the ctpolicy
   331  * Instruct the CA to issue a final certificate with the SCTs
   332
   333* 5-6: CA does the following:
   334  * Sign a final certificate with SCTs provided by the RA
   335  * Create the first OCSP response for the final certificate
   336  * Sign the final certificate and the first OCSP response
   337  * Store the final certificate
   338  * Commit the CA DB transaction if everything worked
   339  * Return the final certificate serial number
   340
   341* 6-7: RA does the following:
   342  * Log the success or failure of the request
   343  * Updates the order to have status valid if the request succeeded
   344  * Updates the order with the serial number of the certificate object
   345
   346* 7-8: WFEv2 does the following:
   347  * Create a URL from the order's certificate's serial number
   348  * Return the order with a certificate URL
   349
   350## Revoke Certificate
   351
   352ACME v2:
   353
   354```
   3551: Client ---cert--> WFEv2
   3562:                   WFEv2 ---RevokeCertByApplicant--> RA
   3573:                   WFEv2 <-----------return--------- RA
   3584: Client <--------- WFEv2
   359```
   360or
   361```
   3621: Client ---cert--> WFEv2
   3632:                   WFEv2 ------RevokeCertByKey-----> RA
   3643:                   WFEv2 <-----------return--------- RA
   3654: Client <--------- WFEv2
   366```
   367
   368
   369* 1-2:WFEv2 does the following:
   370  * Verify that the request is a POST
   371  * Verify the JWS signature on the POST body
   372  * Verify that the JWS signature is either:
   373    * The account key for the certificate, or
   374    * The account key for an account with valid authorizations for all names in
   375      the certificate, or
   376    * The public key from the certificate
   377  * Parse the certificate request object
   378
   379* 3-4: RA does the following:
   380  * Mark the certificate as revoked.
   381  * Log the success or failure of the revocation
   382
   383* Later, (not-pictured) the CA will:
   384  * Sign an OCSP response indicating revoked status for this certificate
   385  * Store the OCSP response in the database
   386
   387* 3-4: WFEv2 does the following:
   388  * Return an indication of the success or failure of the revocation

View as plain text