Proto commits in letsencrypt/boulder

These commits are when the Protocol Buffers files have changed: (only the last 100 relevant commits are shown)

Commit:e625ff3
Author:Samantha Frank
Committer:GitHub

sa: Store and manage rate limit overrides in the database (#8142) Add support for managing and querying rate limit overrides in the database. - Add `sa.AddRateLimitOverride` to insert or update a rate limit override. This will be used during Rate Limit Override Portal to commit approved overrides to the database. - Add `sa.DisableRateLimitOverride` and `sa.EnableRateLimitOverride` to toggle override state. These will be used by the `admin` tool. - Add `sa.GetRateLimitOverride` to retrieve a single override by limit enum and bucket key. This will be used by the Rate Limit Portal to prevent duplicate or downgrade requests but allow upgrade requests. - Add `sa.GetEnabledRateLimitOverrides` to stream all currently enabled overrides. This will be used by the rate limit consumers (`wfe` and `ra`) to refresh the overrides in-memory. - Implement test coverage for all new methods.

The documentation is generated from this commit.

Commit:650c269
Author:James Renken
Committer:GitHub

ra, va: Bypass CAA for IP identifiers & use Identifier in IsCAAValidRequest (#8153) In `vapb.IsCAAValidRequest`, even though CAA is only for DNS names, deprecate `Domain` in favour of `Identifier` for consistency. In `va.DoCAA`, reject attempts to validate CAA for non-DNS identifiers. Rename `identifier` to `ident` inside some VA functions, also for consistency. In `ra.checkDCVAndCAA` & `ra.checkAuthorizationsCAA`, bypass CAA checks for IP address identifiers. Part of #7995

Commit:8e7eaa9
Author:James Renken
Committer:James Renken

va: Use Identifier in IsCAAValidRequest Even though CAA is only for DNS names, deprecate `Domain` in favour of `Identifier` for consistency. In `DoCAA`, reject attempts to validate CAA for non-DNS identifiers. Rename `identifier` to `ident` inside some VA functions, also for consistency.

Commit:52615d9
Author:James Renken
Committer:GitHub

ra: Fully support identifiers in NewOrder, PerformValidation & RevokeCertByApplicant (#8139) In `ra.NewOrder`, improve safety of authz reuse logic by making it explicit that only DNS identifiers might be wildcards. Also, now that the conditional statements need to be more complicated, collapse them for brevity. In `vapb.PerformValidationRequest`, remove `DnsName`. In `ra.PerformValidation`, pass an `Identifier` instead of a `DnsName`. In `ra.RevokeCertByApplicant`, check that the requester controls identifiers of all types (not just DNS). Fixes #7995 (the RA now fully supports IP address identifiers, except for rate limits) Fixes #7647 Part of #8023

Commit:bf37683
Author:Samantha
Committer:Samantha

Addressing comments.

Commit:4b701c6
Author:James Renken
Committer:James Renken

Remove DnsName from vapb.PerformValidationRequest

Commit:8a4d0cc
Author:James Renken
Committer:James Renken

va: Use Identifier in IsCAAValidRequest Even though CAA is only for DNS names, deprecate `Domain` in favour of `Identifier` for consistency. In `DoCAA`, reject attempts to validate CAA for non-DNS identifiers. Rename `identifier` to `ident` inside some VA functions, also for consistency.

Commit:884441e
Author:James Renken

va: Use Identifier in IsCAAValidRequest Even though CAA is only for DNS names, deprecate `Domain` in favour of `Identifier` for consistency. In `DoCAA`, reject attempts to validate CAA for non-DNS identifiers. Rename `identifier` to `ident` inside some VA functions, also for consistency.

Commit:86687d2
Author:James Renken

Remove DnsName from vapb.PerformValidationRequest

Commit:d3e0156
Author:Samantha
Committer:Samantha

sa: Rate limit overrides in the database

Commit:712495e
Author:Samantha
Committer:Samantha

sa: Rate limit overrides in the database

Commit:e8eddc0
Author:Jacob Hoffman-Andrews
Committer:GitHub

ca: remove capb.IssueCertificateForPrecertificateRequest (#8127) Fixes #8039

Commit:0503782
Author:Jacob Hoffman-Andrews
Committer:Jacob Hoffman-Andrews

Remove capb.IssueCertificateForPrecertificateRequest

Commit:d800055
Author:Jacob Hoffman-Andrews
Committer:GitHub

ca: Remove IssuePrecertificateResponse (#8115) Instead, simply return DER bytes from `issuePrecertificate`, and accept regular parameters to `issueCertificateForPrecertificate` (instead of a proto message). Also, move the lookup of the certificate profile up to `IssueCertificate`, and pass the selected `*certProfileWithId` to both `issuePrecertificate` and `issueCertificateForPrecertificate`. Also, change `issueCertificateForPrecertificate` to just return DER, not a `*corepb.Certificate` (of which most fields were already being ignored).

Commit:722f7c5
Author:James Renken
Committer:GitHub

sa: Support new identifier types in authz getting funcs (#8104) Refactor `GetAuthorizations2`, `GetValidAuthorizations2` and `GetValidOrderAuthorizations2` to support non-DNS identifier types. Remove the deprecated `DnsNames` field from the `GetAuthorizationsRequest` and `GetValidAuthorizationsRequest` structs. All users of these structs use `Identifier` instead. Fixes #7922 Part of #7311

Commit:ff9e59d
Author:James Renken
Committer:GitHub

core: Remove DnsNames from Order (#8108) Remove the deprecated `DnsNames` field from the `corepb.Order` proto message. All users of this struct use `Identifiers` instead. This unblocks future changes that will require `Order` users to handle different identifier types. Part of #7311

Commit:9b53c34
Author:James Renken
Committer:GitHub

sa: Remove DnsNames from more request protos (#8105) Remove the deprecated `DnsNames` field from the `CountFQDNSetsRequest`, `FQDNSetExistsRequest`, and `GetOrderForNamesRequest` structs. All users of these structs use `Identifier` instead. Part of #7311

Commit:c426fc7
Author:James Renken
Committer:GitHub

sa: Remove DnsNames from NewOrderRequest (#8101) Remove the deprecated `DnsNames` field from the `NewOrderRequest` struct. All users of this struct use `Identifier` instead. Part of #7311

Commit:38a7197
Author:James Renken
Committer:GitHub

sa: Support IP identifiers in CountInvalidAuthorizations2 (#8098) Remove the deprecated `DnsName` field from the `CountInvalidAuthorizationsRequest` struct. All users of this struct use `Identifier` instead. Part of #7311

Commit:1e00ee5
Author:James Renken
Committer:GitHub

ra: Remove DnsNames from NewOrderRequest (#8100) Remove the deprecated `DnsNames` field from the `NewOrderRequest` struct. All users of this struct use `Identifier` instead. Part of #7311

Commit:767abc7
Author:James Renken
Committer:GitHub

core: Remove DnsName from Authorization (#8097) Remove the deprecated `DnsName` field from the core `Authorization` struct. All users of this struct use `Identifier` instead. This unblocks future changes that will require `Authorization` users to handle different identifier types. Part of #7311

Commit:76de5bf
Author:Jacob Hoffman-Andrews
Committer:GitHub

ca: unexport IssuePrecertificate and IssueCertificateForPrecertificate (#8092) These methods are still preserved as-is for now, and still take proto messages as arguments. But they are not exported as RPCs. Refactoring the arguments will be a followup PR. Part of #8039

Commit:3f879ed
Author:James Renken
Committer:GitHub

Add Identifiers to Authorization & Order structs (#7961) Add `identifier` fields, which will soon replace the `dnsName` fields, to: - `corepb.Authorization` - `corepb.Order` - `rapb.NewOrderRequest` - `sapb.CountFQDNSetsRequest` - `sapb.CountInvalidAuthorizationsRequest` - `sapb.FQDNSetExistsRequest` - `sapb.GetAuthorizationsRequest` - `sapb.GetOrderForNamesRequest` - `sapb.GetValidAuthorizationsRequest` - `sapb.NewOrderRequest` Populate these `identifier` fields in every function that creates instances of these structs. Use these `identifier` fields instead of `dnsName` fields (at least preferentially) in every function that uses these structs. When crossing component boundaries, don't assume they'll be present, for deployability's sake. Deployability note: Mismatched `cert-checker` and `sa` versions will be incompatible because of a type change in the arguments to `sa.SelectAuthzsMatchingIssuance`. Part of #7311

Commit:ebf232c
Author:Aaron Gable
Committer:GitHub

Return updated account object on DeactivateRegistration path (#8060) Update the SA to re-query the database for the updated account after deactivating it, and return this to the RA. Update the RA to pass this value through to the WFE. Update the WFE to return this value, rather than locally modifying the pre-deactivation account object, if it gets one (for deployability). Also remove the RA's requirement that the request object specify its current status so that the request can be trimmed down to just an ID. This proto change is backwards-compatible because the new DeactivateRegistrationRequest's registrationID field has the same type (int64) and field number (1) as corepb.Registration's id field. Part of https://github.com/letsencrypt/boulder/issues/5554

Commit:428fcb3
Author:Samantha Frank
Committer:GitHub

ARI: Store and reflect optional "replaces" value for Orders (#8056) - Plumb the "replaces" value from the WFE through to the SA via the RA - Store validated "replaces" value for new orders in the orders table - Reflect the stored "replaces" value to subscribers in the order object - Reorder CertificateProfileName before Replaces/ReplacesSerial in RA and SA protos for consistency Fixes #8034

Commit:3e6a8e2
Author:James Renken
Committer:GitHub

va: Support IP address identifiers (#8020) Add an `identifier` field to the `va.PerformValidationRequest` proto, which will soon replace its `dnsName` field. Accept and prefer the `identifier` field in every VA function that uses this struct. Don't (yet) assume it will be present. Throughout the VA, accept and handle the IP address identifier type. Handling is similar to DNS names, except that `getAddrs` is not called, and consider that: - IPs are represented in a different field in the `x509.Certificate` struct. - IPs must be presented as reverse DNS (`.arpa`) names in SNI for [TLS-ALPN-01 challenge requests](https://datatracker.ietf.org/doc/html/rfc8738#name-tls-with-application-layer-). - IPv6 addresses are enclosed in square brackets when composing or parsing URLs. For HTTP-01 challenges, accept redirects to bare IP addresses, which were previously rejected. Fixes #2706 Part of #7311

Commit:6b85b34
Author:Samantha Frank
Committer:GitHub

email/exporter: Add email.Exporter gRPC service (#8017) Initial implementation of the email.Exporter gRPC service to be used by the new cmd/email-exporter. Part of #7966

Commit:e6c812a
Author:Samantha Frank
Committer:GitHub

va/ra: Deprecate EnforceMultiCAA and EnforceMPIC (#8025) Replace DCV and CAA checks (PerformValidation and IsCAAValid) in va/va.go and va/caa.go with their MPIC compliant counterparts (DoDCV and DoCAA) in va/vampic.go. Deprecate EnforceMultiCAA and EnforceMPIC and default code paths as though they are both true. Require that RIR and Perspective be set for primary and remote VAs. Fixes #7965 Fixes #7819

Commit:692bd53
Author:Jacob Hoffman-Andrews
Committer:GitHub

ca: unsplit issuance flow (#8014) Add a new RPC to the CA: `IssueCertificate` covers issuance of both the precertificate and the final certificate. In between, it calls out to the RA's new method `GetSCTs`. The RA calls the new `CA.IssueCertificate` if the `UnsplitIssuance` feature flag is true. The RA had a metric that counted certificates by profile name and hash. Since the RA doesn't receive a profile hash in the new flow, simply record the total number of issuances. Fixes https://github.com/letsencrypt/boulder/issues/7983

Commit:badc330
Author:Samantha
Committer:Samantha

Prospect(s) -> Contact(s)

Commit:30c983b
Author:Samantha

Merge remote-tracking branch 'origin/main' into add-email-exporter

Commit:e0e5a17
Author:Jacob Hoffman-Andrews
Committer:GitHub

crl: add cache control headers (#8011) The crl-storer passes along Cache-Control and Expires from the crl-updater (because the crl-updater knows the UpdatePeriod). The crl-updater calculates the Expires header based on when it expects to update the CRL, plus a margin of error. Fixes #8004

Commit:e8ff500
Author:Samantha

Adjust proto.

Commit:fd39210
Author:Samantha
Committer:Samantha

email: Initial Exporter implementation

Commit:6695895
Author:Aaron Gable
Committer:GitHub

RA: Don't reuse authzs with mismatched profiles (#7967) In the RA, inspect the profile of all authorizations returned when looking for authz reuse, and refuse to reuse any whose profile doesn't match the requested profile of the current NewOrder request. Fixes https://github.com/letsencrypt/boulder/issues/7949

Commit:86ab2ed
Author:Aaron Gable
Committer:GitHub

SA: Support profiles associated with authorizations (#7956) Add "certificateProfileName" to the model used to insert new authz2 rows and to the list of column names read when retrieving rows from the authz2 table. Add support for this column to the functions which convert to and from authz2 model types. Add support for the profile field to core types so that it can be returned by the SA. Fixes https://github.com/letsencrypt/boulder/issues/7955

Commit:3fcaebe
Author:James Renken
Committer:GitHub

core: Remove contactsPresent from Registration (#7952) Remove the `contactsPresent` field from `corepb.Registration`, and all places where it is set. #7933 removed all places where it was used. Fixes #7920

Commit:02af552
Author:Jacob Hoffman-Andrews
Committer:GitHub

sa: add GetRevokedCertsByShard (#7946) The SA had some logic (not yet in use) to return revoked certificates either by temporal sharding (if `req.ShardIdx` is zero) or by explicit sharding (if `req.ShardIdx` is nonzero). This PR splits the function into two. The existing `GetRevokedCerts` always does temporal sharding. The new `GetRevokedCertsByShard` always does explicit sharding. Eventually only `GetRevokedCertsByShard` will be necessary. This change was discussed in https://github.com/letsencrypt/boulder/issues/7094#issuecomment-2587940962 and is a precursor to having the crl-updater call both methods, so we can merge the results when generating CRLs.

Commit:a908070
Author:Jacob Hoffman-Andrews
Committer:GitHub

ra: revoke with explicit CRL shard (#7944) In RA.RevokedCertificate, if the certificate being revoked has a crlDistributionPoints extension, parse the URL and pass the appropriate shard to the SA. This required some changes to the `admin` tool. When a malformed certificate is revoked, we don't have a parsed copy of the certificate to extract a CRL URL from. So, specifically when a malformed certificate is being revoked, allow specifying a CRL shard. Because different certificates will have different shards, require one-at-a-time revocation for malformed certificates. To support that refactoring, move the serial-cleaning functionality earlier in the `admin` tool's flow. Also, split out one of the cases handled by the `revokeCertificate` helper in the RA. For admin malformed revocations, we need to accept a human-specified ShardIdx, so call the SA directly in that case (and skip stat increment since admin revocations aren't useful for metrics). This allows `revokeCertificate` to be a more helpful helper, by extracting serial, issuer ID, and CRL shard automatically from an `*x509.Certificate`. Note: we don't yet issue certificates with the crlDistributionPoints extension, so this code will not be active until we start doing so. Part of #7094.

Commit:67ac7f7
Author:Samantha

WIP

Commit:2e1f733
Author:James Renken
Committer:GitHub

ra/sa: Remove deprecated UpdateRegistration methods (#7911) This is the final stage of #5554: removing the old, combined `UpdateRegistration` flow, which has been replaced by `UpdateRegistrationContact` and `UpdateRegistrationKey`. Those new functions have their own tests. The RA's `UpdateRegistration` function no longer has any callers (as of #7827's deployment), so it is safely deployable to remove it from the SA too, and its request from gRPC. Fixes #5554 --------- Co-authored-by: Jacob Hoffman-Andrews <jsha+github@letsencrypt.org> Co-authored-by: Aaron Gable <aaron@letsencrypt.org>

Commit:45a56ae
Author:Samantha Frank
Committer:GitHub

database: No longer store or retrieve InitialIP (#7942) The initialIP column has been defaulted to 0.0.0.0 since #7760. Remove this field from the all structs while leaving the schema itself intact. Part of #7917

Commit:274d446
Author:James Renken
Committer:GitHub

ra: Remove isRenewal & isARIRenewal from NewOrderRequest proto (#7932) Fixes #7671 Fixes #5545

Commit:e4668b4
Author:James Renken
Committer:GitHub

Deprecate DisableLegacyLimitWrites & UseKvLimitsForNewOrder flags; remove code using certificatesPerName & newOrdersRL tables (#7858) Remove code using `certificatesPerName` & `newOrdersRL` tables. Deprecate `DisableLegacyLimitWrites` & `UseKvLimitsForNewOrder` flags. Remove legacy `ratelimit` package. Delete these RA test cases: - `TestAuthzFailedRateLimitingNewOrder` (rl: `FailedAuthorizationsPerDomainPerAccount`) - `TestCheckCertificatesPerNameLimit` (rl: `CertificatesPerDomain`) - `TestCheckExactCertificateLimit` (rl: `CertificatesPerFQDNSet`) - `TestExactPublicSuffixCertLimit` (rl: `CertificatesPerDomain`) Rate limits in NewOrder are now enforced by the WFE, starting here: https://github.com/letsencrypt/boulder/blob/5a9b4c4b18fd0aa670bc6332bdd59701ff7d6186/wfe2/wfe.go#L781 We collect a batch of transactions to check limits, check them all at once, go through and find which one(s) failed, and serve the failure with the Retry-After that's furthest in the future. All this code doesn't really need to be tested again; what needs to be tested is that we're returning the correct failure. That code is `NewOrderLimitTransactions`, and the `ratelimits` package's tests cover this. The public suffix handling behavior is tested by `TestFQDNsToETLDsPlusOne`: https://github.com/letsencrypt/boulder/blob/5a9b4c4b18fd0aa670bc6332bdd59701ff7d6186/ratelimits/utilities_test.go#L9 Some other RA rate limit tests were deleted earlier, in #7869. Part of #7671.

Commit:d42865c
Author:Jacob Hoffman-Andrews
Committer:GitHub

sa: add Limit field to CountFQDNSetsRequest (#7887) This allows us to replace FQDNSetExists with a call to FQDNSetTimestampsForWindow, with Limit set to 1. That, in turn, will allow us to log the time since issuance of the most recent certificate with a given FQDNSet.

Commit:1f9f2bc
Author:Jacob Hoffman-Andrews
Committer:GitHub

sa: remove CountFQDNSetTimestamps (#7883) This was superseded in #6220 by FQDNTimestampsForWindow and is no longer called.

Commit:dda8acc
Author:Samantha Frank
Committer:GitHub

RA/VA: Add MPIC compliant DCV and CAA checks (#7870) Today, we have VA.PerformValidation, a method called by the RA at challenge time to perform DCV and check CAA. We also have VA.IsCAAValid, a method invoked by the RA at finalize time when a CAA re-check is necessary. Both of these methods can be executed on remote VA perspectives by calling the generic VA.performRemoteValidation. This change splits VA.PerformValidation into VA.DoDCV and VA.DoCAA, which are both called on remote VA perspectives by calling the generic VA.doRemoteOperation. VA.DoDCV, VA.DoCAA, and VA.doRemoteOperation fulfill the requirements of SC-067 V3: Require Multi-Perspective Issuance Corroboration by: - Requiring at least three distinct perspectives, as outlined in the "Phased Implementation Timeline" in BRs section 3.2.2.9 ("Effective March 15, 2025"). - Ensuring that the number of non-corroborating (failing) perspectives remains below the threshold defined by the "Table: Quorum Requirements" in BRs section 3.2.2.9. - Ensuring that corroborating (passing) perspectives reside in at least 2 distinct Regional Internet Registries (RIRs) per the "Phased Implementation Timeline" in BRs section 3.2.2.9 ("Effective March 15, 2026"). - Including an MPIC summary consisting of: passing perspectives, failing perspectives, passing RIRs, and a quorum met for issuance (e.g., 2/3 or 3/3) in each validation audit log event, per BRs Section 5.4.1, Requirement 2.8. When the new SeparateDCVAndCAAChecks feature flag is enabled on the RA, calls to VA.IsCAAValid (during finalization) and VA.PerformValidation (during challenge) are replaced with calls to VA.DoCAA and a sequence of VA.DoDCV followed by VA.DoCAA, respectively. Fixes #7612 Fixes #7614 Fixes #7615 Fixes #7616

Commit:e9701e5
Author:Samantha

WIP

Commit:27a7714
Author:Samantha Frank
Committer:GitHub

VA: Make performRemoteValidation more generic (#7847) - Make performRemoteValidation a more generic function that returns a new remoteResult interface - Modify the return value of IsCAAValid and PerformValidation to satisfy the remoteResult interface - Include compile time checks and tests that pass an arbitrary operation

Commit:7cfd5bb
Author:Samantha

WIP

Commit:6ef1fd0
Author:Samantha
Committer:Samantha

Merge remote-tracking branch 'origin/main' into mpic-part-two

Commit:a8cdaf8
Author:Samantha Frank
Committer:GitHub

ratelimit: Remove legacy registrations per IP implementation (#7760) Part of #7671

Commit:559575e
Author:Samantha

Merge remote-tracking branch 'origin/main' into mpic-part-two

Commit:c9836ac
Author:Samantha

expectedKeyAuthorization

Commit:ca5fdd1
Author:Samantha

Comment grammar and removing a renaming

Commit:19b0acf
Author:Samantha

Addressing comments

Commit:4057216
Author:Samantha
Committer:Samantha

VA: Add a method for performing MPIC compliant CAA checks

Commit:29dee31
Author:Samantha
Committer:Samantha

VA: Add a method for performing MPIC compliant challenge validation

Commit:6a2819a
Author:James Renken
Committer:GitHub

Introduce separate UpdateRegistrationContact & UpdateRegistrationKey methods in RA & SA (#7735) Introduce separate UpdateRegistrationContact & UpdateRegistrationKey methods in RA & SA Clear contact field during DeactivateRegistration Part of #7716 Part of #5554

Commit:d7a7044
Author:Samantha
Committer:Samantha

WIP

Commit:37b85fb
Author:Samantha Frank
Committer:GitHub

VA/RVA: Add metadata necessary for the MPIC ballot (#7732) - Add `Perspective` and `RIR` fields to the remote-va configuration - Configure RVA ValidationAuthorityImpl instances with the contents of the JSON configuration - Configure VA ValidationAuthorityImpl instances with the constant `va.PrimaryPerspective` - Log `Perspective` for non-Primary Perspectives, per the MPIC requirements in section 5.4.1 (2) vii of the BRs. Also log the RIR for posterity. - Introduce `ValidationResult` RPC fields `Perspective` and `Rir`, which are not currently used but will be required for corroboration in #7616 Fixes https://github.com/letsencrypt/boulder/issues/7613 Part of https://github.com/letsencrypt/boulder/issues/7615 Part of https://github.com/letsencrypt/boulder/issues/7616

Commit:dad9e08
Author:Aaron Gable
Committer:GitHub

Lay the groundwork for supporting IP identifiers (#7692) Clean up how we handle identifiers throughout the Boulder codebase by - moving the Identifier protobuf message definition from sa.proto to core.proto; - adding support for IP identifier to the "identifier" package; - renaming the "identifier" package's exported names to be clearer; and - ensuring we use the identifier package's helper functions everywhere we can. This will make future work to actually respect identifier types (such as in Authorization and Order protobuf messages) simpler and easier to review. Part of https://github.com/letsencrypt/boulder/issues/7311

Commit:ced0117
Author:Aaron Gable
Committer:GitHub

Remove deprecated sapb.Authorizations.Authz "map" (#7658) This field was deprecated in https://github.com/letsencrypt/boulder/pull/7646 and the last uses of it were removed in https://github.com/letsencrypt/boulder/pull/7650.

Commit:e1790a5
Author:Aaron Gable
Committer:GitHub

Remove deprecated sapb.NewAuthzRequest fields (#7651) Remove the id, identifierValue, status, and challenges fields from sapb.NewAuthzRequest. These fields were left behind from the previous corepb.Authorization request type, and are now being ignored by the SA. Since the RA is no longer constructing full challenge objects to include in the request, remove pa.ChallengesFor and replace it with the much simpler pa.ChallengeTypesFor. Part of https://github.com/letsencrypt/boulder/issues/5913

Commit:46859a2
Author:Aaron Gable
Committer:GitHub

Use consistent naming for dnsName gRPC fields (#7654) Find all gRPC fields which represent DNS Names -- sometimes called "identifier", "hostname", "domain", "identifierValue", or other things -- and unify their naming. This naming makes it very clear that these values are strings which may be included in the SAN extension of a certificate with type dnsName. As we move towards issuing IP Address certificates, all of these fields will need to be replaced by fields which carry both an identifier type and value, not just a single name. This unified naming makes it very clear which messages and methods need to be updated to support non-dnsName identifiers. Part of https://github.com/letsencrypt/boulder/issues/7647

Commit:fa732df
Author:Aaron Gable
Committer:GitHub

Remove challenge.ProvidedKeyAuthorization (#7655) This field was deprecated in https://github.com/letsencrypt/boulder/pull/7515, and has been fully replaced by vapb.PerformValidationRequest.ExpectedKeyAuthorization. Fixes https://github.com/letsencrypt/boulder/issues/7514

Commit:22b1771
Author:Aaron Gable
Committer:GitHub

RA: Add GetAuthorization method to filter disabled challenges (#7652) Add a new "GetAuthorization" method to the RA. This method is very similar to the SA's existing "GetAuthorization2" method, except that it also uses the RA's built-in Policy Authority to filter out any challenges which are currently disabled. In a follow-up change, the WFE will be updated to use this method when retrieving authorizations and challenges for display, so that we can ensure disabled challenges are not presented to ACME clients. Part of https://github.com/letsencrypt/boulder/issues/5913

Commit:28f0934
Author:Aaron Gable
Committer:GitHub

Simplify GetValidOrderAuthorizations2 (#7646) Simplify SA.GetValidOrderAuthorizations2 so that it no longer conditions the query on the status, expiry, or registration ID of the authorization rows. This gives the query much better performance, because it no longer tries to use an overly-large index, and fall back to large row-scans when the query planner decides the index is too large. While we're here, also improve the return type of GetValidOrderAuthorizations2, so that instead of returning a map of names to authorizations, it simply returns a list of authzs. This both reduces the size of the gRPC message (once the old map is fully removed), and improves its correctness because we cannot count on names to be unique across multiple identifier types. Finally, improve the RA code which calls SA.GetValidOrderAuthorizations2 to handle this improved return type, to make fewer assumptions about identifier types, and to separate static authorization-checking from CAA rechecking. Fixes https://github.com/letsencrypt/boulder/issues/7645

Commit:35b0b55
Author:Aaron Gable
Committer:GitHub

Improve how we create new authorizations (#7643) Within the NewOrderAndAuthzsRequest, replace the corepb.Authorization field with a new sapb.NewAuthzRequest message. This message has all of the same field types and numbers, and the RA still populates all of these fields when constructing a request, for backwards compatibility. But it also has new fields (an Identifier carrying both type and value, a list of challenge types, and a challenge token) which the RA preferentially consumes if present. This causes the content of our NewOrderAndAuthzsRequest to more closely match the content that will be created at the database layer. Although this may seem like a step backwards in terms of abstraction, it is also a step forwards in terms of both efficiency (not having to transmit multiple nearly-identical challenge objects) and correctness (being guaranteed that the token is actually identical across all challenges). After this change is deployed, it will be followed by a change which removes the old fields from the NewAuthzRequest message, to realize the efficiency gains. Part of https://github.com/letsencrypt/boulder/issues/5913

Commit:c9132ba
Author:Aaron Gable
Committer:GitHub

Delete sa.GetPendingAuthorization2 (#7648) This method's last caller was removed in https://github.com/letsencrypt/boulder/pull/5862, when the ACMEv1 NewAuthorization code path was deleted. It has been dead code ever since.

Commit:e54c5bb
Author:Aaron Gable
Committer:GitHub

RA: pass through unpause requests to SA (#7630) Have the RA's UnpauseAccount gRPC method forward the requested account ID to the SA's corresponding method, and in turn forward the SA's count of unpaused identifiers back to the caller in the response. Changing the response message from emptypb.Empty to a new rapb.UnpauseAccountResponse is safe, because message names are not transmitted on the wire, only message field numbers. While we're here, drastically simplify the wfe_test and sfe_test Mock RAs, so they don't have to implement methods that aren't actually used by the tests. Fixes https://github.com/letsencrypt/boulder/issues/7536

Commit:98a4bc0
Author:Aaron Gable
Committer:GitHub

Rename 'now' to 'validUntil' in GetAuthz requests (#7631) The name "now" was always misleading, because we never set the value to be the actual current time, we always set it to be some time in the future to avoid returning authzs which expire in the very near future. Changing the name to "validUntil" matches the current naming in GetPendingAuthorizationRequest.

Commit:63452d5
Author:Samantha Frank
Committer:GitHub

sa: Avoid database timeouts in UnpauseAccount (#7572) SA method UnpauseAccount uses up to 5 `UPDATE` query iterations, each with a `LIMIT` of 10000, to unpause up to 50000 identifiers and returns a count of identifiers unpaused. Part of #7475

Commit:55c274d
Author:Samantha Frank
Committer:GitHub

ratelimits: Exempt renewals from NewOrdersPerAccount and CertificatesPerDomain (#7513) - Rename `NewOrderRequest` field `LimitsExempt` to `IsARIRenewal` - Introduce a new `NewOrderRequest` field, `IsRenewal` - Introduce a new (temporary) feature flag, `CheckRenewalExemptionAtWFE` WFE: - Perform renewal detection in the WFE when `CheckRenewalExemptionAtWFE` is set - Skip (key-value) `NewOrdersPerAccount` and `CertificatesPerDomain` limit checks when renewal detection indicates the the order is a renewal. RA: - Leave renewal detection in the RA intact - Skip renewal detection and (legacy) `NewOrdersPerAccount` and `CertificatesPerDomain` limit checks when `CheckRenewalExemptionAtWFE` is set and the `NewOrderRequest` indicates that the order is a renewal. Fixes #7508 Part of #5545

Commit:8c324a5
Author:Phil Porada
Committer:GitHub

RA: Add UnpauseAccountRequest protobuf message and service (#7537) Add the `ra.UnpauseAccount` which takes an `rapb.UnpauseAccountRequest` input parameter. The method is just a stub to allow downstream SFE development to continue. There is relevant ongoing work in the SA which will eventually reside in this stub method.

Commit:594cb13
Author:Samantha
Committer:GitHub

SA: Implement schema and methods for (account, hostname) pausing (#7490) Add the storage implementation for our new (account, hostname) pair pausing feature. - Add schema and model for for the new paused table - Add SA service methods for interacting with the paused table Part of #7406 Part of #7475

Commit:09693f0
Author:Aaron Gable
Committer:GitHub

Deprecate Challenge.ProvidedKeyAuthorization (#7515) The core.Challenge.ProvidedKeyAuthorization field is problematic, both because it is poorly named (which is admittedly easily fixable) and because it is a field which we never expose to the client yet it is held on a core type. Deprecate this field, and replace it with a new vapb.PerformValidationRequest.ExpectedKeyAuthorization field. Within the VA, this also simplifies the primary logic methods to just take the expected key authorization, rather than taking a whole (largely unnecessary) challenge object. This has large but wholly mechanical knock-on effects on the unit tests. While we're here, improve the documentation on core.Challenge itself, and remove Challenge.URI, which was deprecated long ago and is wholly unused. Part of https://github.com/letsencrypt/boulder/issues/7514

Commit:6b4577e
Author:dependabot[bot]
Committer:GitHub

update otel dependencies to v1.27.0 and v0.52.0 (#7496) Directly update: - go.opentelemetry.io/otel/* from v1.26.0 to v1.27.0 - go.opentelemetry.io/contrib/* from v0.51.0 to v0.52.0 Indirectly update: - google.golang.org/protobuf from v1.33.0 to v1.34.0 This update breaks some of our existing otel grpc interceptors, but in return allows us to use the newer grpc StatsHandler mechanism, while still filtering out health-check requests. Fixes https://github.com/letsencrypt/boulder/issues/7235

Commit:fc7c522
Author:Phil Porada
Committer:GitHub

RA: Audit log and track cert profile names and hashes (#7433) * Adds `CertProfileName` to the CAs `capb.IssuePrecertificateResponse` so the RA can receive the CAs configured default profile name for audit logging/metrics. This is useful for when the RA sends an empty string as the profile name to the CA, but we want to know exactly what the profile name chosen by the CA was, rather than just relying on comparing hashes between CA and RA audit logs. * Adds the profile name and hash to RA audit logs emitted after a successful issuance. * Adds new labels to the existing `new_certificates` metric exported by the RA. ``` # HELP new_certificates A counter of new certificates including the certificate profile name and hexadecimal certificate profile hash # TYPE new_certificates counter new_certificates{profileHash="de4c8c8866ed46b1d4af0d79e6b7ecf2d1ea625e26adcbbd3979ececd8fbd05a",profileName="defaultBoulderCertificateProfile"} 2 ``` Fixes https://github.com/letsencrypt/boulder/issues/7421

Commit:5c97f99
Author:Aaron Gable
Committer:GitHub

SA: Remove unused PreviousCertificateExists method (#7439) This method has had no callers since the removal of ACMEv1.

Commit:1f8a6e8
Author:Aaron Gable
Committer:GitHub

Remove IssueCertificateRequest.IssuerNameID (#7409) This field was introduced in https://github.com/letsencrypt/boulder/pull/5222 to allow the old v1 WFEs to continue to tightly control which issuers were used, rather than letting the CA dynamically pick an issuer based on the to-be-issued certificate's public key. The plumbing between the v1 WFEs and the RA was removed in https://github.com/letsencrypt/boulder/pull/5900, and this has been dead code ever since. Part of https://github.com/letsencrypt/boulder/issues/7291

Commit:206c35f
Author:dependabot[bot]
Committer:GitHub

build(deps): bump google.golang.org/protobuf from 1.32.0 to 1.33.0 (#7384) Updates google.golang.org/protobuf from 1.32.0 to 1.33.0 Also updates github.com/golang/protobuf from 1.5.3 to 1.5.4

Commit:8d169a8
Author:Aaron Gable
Committer:GitHub

Add certificateProfileName to RA, SA, and Core order protos (#7381) This adds the profile name to the proto messages necessary to propagate it from the WFE to the SA, and from the SA to the CA. This change is safe to land prior to any logic being added, and unblocks profile-handling logic changes to the WFE, RA, SA, and CA. Part of https://github.com/letsencrypt/boulder/issues/7309

Commit:6710ebe
Author:Aaron Gable
Committer:GitHub

admin: use SA to get serials by account and by SPKI hash (#7369) Add two new methods to the SA, GetSerialsByKey and GetSerialsByAccount, which use the same query as the admin tool has previously used to get serials matching a given SPKI hash or a given registration ID. These two new gRPC methods read the database row-by-row and produce streams of results to keep SA memory usage low. Use these methods in the admin tool so it no longer needs a direct database connection for these actions. Part of https://github.com/letsencrypt/boulder/issues/7350

Commit:bb82726
Author:Phil Porada
Committer:GitHub

CA: gRPC plumbing for multiple certificate profiles (#7331) Adds a new `certProfileName` message to the `CA.IssueCertificateRequest`. This field contains a human-readable "name" set by the [WFE2](https://github.com/letsencrypt/boulder/issues/7332), and in turn the RA. At the time of precertificate issuance, the receiving CA will determine if it is capable of fulfilling the `ra.CA.IssuePrecertificate` request for the given `certProfileName`. If the name is found in the CA's map, the CA will return a `capb.IssuePrecertificateResponse` message with a populated `certProfileHash` field back to the RA. When that RA calls `ra.CA.IssueCertificateForPrecertificate`, it will send that same `certProfileHash` message to a CA which must ensure it contains a certificate profile matching the provided hash. If the hash in found in the CA's map a final certificate issuance attempt will proceed. This is done to prevent certificate profile changes in the duration between requests from causing a mismatch between precerticate and final certificate. Part of https://github.com/letsencrypt/boulder/issues/7309 Part of https://github.com/letsencrypt/boulder/issues/6966

Commit:8ede0e9
Author:Samantha
Committer:GitHub

RA/ARI: Add method for tracking certificate replacement (#7293) - Add new `replaces` field to RA.NewOrder requests - Pass new `replaces` field to `SA.NewOrderAndAuthzs` - Add new `limitsExempt` field to RA.NewOrder requests - Ensure the RA follows this exemption for all NewOrder rate limits

Commit:f10abd2
Author:Samantha
Committer:GitHub

SA/ARI: Add method of tracking certificate replacement (#7284) Part of #6732 Part of #7038

Commit:0e9f5d3
Author:Phil Porada
Committer:GitHub

va: Audit log which DNS resolver performs a lookup (#7271) Adds the chosen DNS resolver to the VAs `ValidationRecord` object so that for each challenge type during a validation, boulder can audit log the resolver(s) chosen to fulfill the request.. Fixes https://github.com/letsencrypt/boulder/issues/7140

Commit:f9f5a40
Author:Samantha

Merge branch 'main' into ari-new-order-replacement

Commit:d1f8fd2
Author:Aaron Gable
Committer:GitHub

RA: improve AdministrativelyRevokeCertificate (#7275) The RA.AdministrativelyRevokeCertificate method has two primary modes of operation: if a certificate DER blob is provided, it parses and extracts information from that blob, and revokes the cert; if no DER is provided, it assumes the cert is malformed, and revokes it (but doesn't do an OCSP cache purge) based on the serial alone. However, this scheme has slightly confusing semantics in the RA and requires that the admin tooling look up the certificates to provide them to the RA. Instead, add a new "malformed" field to the RA's AdministrativelyRevokeCertificateRequest, and deprecate the "cert" field of that same request. When the malformed boolean is false, the RA will look up and parse the certificate itself. When the malformed field is true, it will revoke the cert based on serial alone. Note that the main logic of AdministrativelyRevokeCertificate -- namely revoking, potentially re-revoking, doing an akamai cache purge, etc -- is not changed by this PR. The only thing that changes here is how the RA gets access to the to-be-revoked certificate's information. Part of https://github.com/letsencrypt/boulder/issues/7135

Commit:08b1f16
Author:Samantha

replacementCertificates

Commit:8f0a5a5
Author:Samantha
Committer:Samantha

WIP

Commit:c305acf
Author:Aaron Gable
Committer:GitHub

SA: Add GetLintPrecertificate gRPC method (#7274) Add a new "GetLintPrecertificate" method to the SA's gRPC service. This acts identically to the existing "GetCertificate", but returns the linting precertificate created just prior to the actual precertificate instead. This is useful for revocation, where we need to be able to act on a serial even if the corresponding (pre)certificate was never issued or never saved to the database. Part of https://github.com/letsencrypt/boulder/issues/7135

Commit:bc5ed18
Author:Aaron Gable
Committer:Aaron Gable

RA: improve AdministrativelyRevokeCertificate

Commit:606e99c
Author:Aaron Gable
Committer:Aaron Gable

SA: Add GetLintPrecertificate gRPC method

Commit:80adba7
Author:Phil Porada

Merge branch 'main' into rva-recheck-caa

Commit:6445feb
Author:Aaron Gable
Committer:GitHub

Publisher: clean up deprecated Request.Precert field (#7165) Now that the RA is using the pubpb.Request.Kind field, we can delete and clean up all references to the older Precert field. Part of https://github.com/letsencrypt/boulder/issues/7161

Commit:51e9f39
Author:Phil Porada
Committer:GitHub

Finish migration from int64 durations to durationpb (#7147) This is a cleanup PR finishing the migration from int64 durations to protobuf `*durationpb.Duration` by removing all usage of the old int64 fields. In the previous PR https://github.com/letsencrypt/boulder/pull/7146 all fields were switched to read from the protobuf durationpb fields. Fixes https://github.com/letsencrypt/boulder/issues/7097

Commit:6925fad
Author:Phil Porada
Committer:GitHub

Finish migration from int64 timestamps to timestamppb (#7142) This is a cleanup PR finishing the migration from int64 timestamps to protobuf `*timestamppb.Timestamps` by removing all usage of the old int64 fields. In the previous PR https://github.com/letsencrypt/boulder/pull/7121 all fields were switched to read from the protobuf timestamppb fields. Adds a new case to `core.IsAnyNilOrZero` to check various properties of a `*timestamppb.Timestamp` reducing the visual complexity for receivers. Fixes https://github.com/letsencrypt/boulder/issues/7060

Commit:e1a8a2e
Author:Aaron Gable
Committer:GitHub

Publisher: expose submission type in metric labels (#7163) Give the publisher a more nuanced view of the three kinds of CT submissions we do: "sct" (submitting a precert to get SCTs), "info" (submitting a precert but not caring about the result), and "final" (submitting a final cert and not caring about the result). Expose these three kinds in the ct_errors_count and ct_submission_time_seconds metrics, so that they can be separately grouped and alerted on. This is an improvement over the current status-quo, which only distinguishes between "precert" and "final" submissions, without being able to distinguish between SCT-retrieving and purely-informational submissions of precerts. This functionality will not be fully operational until the RA begins informing the publisher of what kind of submission this is. Part of https://github.com/letsencrypt/boulder/issues/7161