Repository navigation
Merge 1.3.2 to main - #37
Merged
Merged
Conversation
--------- Co-authored-by: Keyfactor <keyfactor@keyfactor.github.io>
Removed specific root/intermediate names (ISRG Root X1, R3) that go stale when Let's Encrypt rotates their chain. Users are now directed to the official Let's Encrypt certificates page to identify the currently active root and intermediate certificates. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ProcessAuthorizations created challenge TXT records but nothing ever called DeleteRecordAsync, leaving orphaned _acme-challenge records in the DNS zone after every enrollment. Track created records and remove them in a finally block after order finalization (best effort, failures are logged and never fail the enrollment). Also fix Cloudflare deletion, which queried by the zone-relative name instead of the FQDN and removed only the first match. AB#111453
There was a problem hiding this comment.
🟡 Changes recommended
DNS cleanup can remove unrelated challenges and fails for Azure, while orders without a Location header can return null request identifiers.
4 open issues
What changed in this PR
Merges release 1.3.2 into main, updating the ACME gateway plugin with DNS challenge cleanup, container configuration, and framework support.
Changes:
- Adds post-enrollment DNS cleanup, improves Cloudflare zone lookup, and hashes order URLs into fixed-length request IDs.
- Adds connector enablement, configurable account storage, and inline Google service-account JSON credentials.
- Adds .NET 10 targeting, updates dependencies, and refreshes deployment documentation.
| File | Description |
|---|---|
| TestProgram/TestProgram.csproj | Adds .NET 10 targeting and updates dependencies. |
| README.md | Documents configuration options and container deployment. |
| integration-manifest.json | Describes the new configuration fields. |
| docsource/configuration.md | Updates authentication, storage, and deployment guidance. |
| CHANGELOG.md | Records release 1.3.0 and 1.3.2 changes. |
| AcmeCaPlugin/Clients/DNS/GoogleDnsProvider.cs | Supports service-account JSON supplied directly in configuration. |
| AcmeCaPlugin/Clients/DNS/DnsProviderFactory.cs | Passes JSON credentials to the Google provider. |
| AcmeCaPlugin/Clients/DNS/CloudflareDnsProvider.cs | Updates zone discovery and matching TXT record deletion. |
| AcmeCaPlugin/Clients/Acme/AcmeClientManager.cs | Passes the configured account storage path. |
| AcmeCaPlugin/Clients/Acme/AccountManager.cs | Supports custom storage paths and a working-directory fallback. |
| AcmeCaPlugin/AcmeClientConfig.cs | Adds enablement, JSON credentials, and storage settings. |
| AcmeCaPlugin/AcmeCaPluginConfig.cs | Exposes annotations for the new settings. |
| AcmeCaPlugin/AcmeCaPlugin.csproj | Adds .NET 10, updates dependencies, and enables assembly metadata generation. |
| AcmeCaPlugin/AcmeCaPlugin.cs | Adds enablement checks, hashed request IDs, and DNS cleanup. |
| .gitignore | Excludes local tooling and migration artifacts. |
Review effort: Balanced
Comment on lines
538
to
+539
| await dnsProvider.CreateRecordAsync(validation.DnsRecordName, validation.DnsRecordValue); | ||
| createdRecords.Add(validation.DnsRecordName); |
Comment on lines
+74
to
+78
| // A wildcard and its base domain publish two TXT values under the same name; remove all of them | ||
| var allDeleted = true; | ||
| foreach (var record in resultArray.EnumerateArray()) | ||
| { | ||
| var recordId = record.GetProperty("id").GetString(); |
| order.OrderUrl, order.Payload?.Status); | ||
|
|
||
| // Extract order identifier BEFORE finalization to ensure we use the original order URL | ||
| var orderIdentifier = ExtractOrderIdentifier(order.OrderUrl); |
| { | ||
| try | ||
| { | ||
| if (await dnsProvider.DeleteRecordAsync(name)) |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
Missing provider definitions and stale harness construction block compilation, while DNS authentication, validation, and cleanup defects remain unresolved.
13 open issues
Missing DNS provider interface and implementations · New Unscoped service-account credentials cannot access Cloud DNS · New Cleanup removes concurrent enrollment TXT values · New Test harness uses removed plugin constructor · New Delete only challenge records owned by the enrollment Track DNS records only after successful creation Bypass CNAME resolution when publishing challenges · New Declare NS1 API key as a secret · New RRset lookups ignore pagination · New Overwrite TXT tokens for wildcard and base domain · New Managed zone selection ignores pagination · New Implement Azure DNS challenge record deletion Fallback to finalize URL for missing order identifier
Review effort: Balanced
| { | ||
| public static class DnsProviderFactory | ||
| { | ||
| public static IDnsProvider Create(AcmeClientConfig config, ILogger logger) |
|
|
||
| _dnsService = new DnsService(new BaseClientService.Initializer | ||
| { | ||
| HttpClientInitializer = credential, |
|
|
||
| var change = new Change | ||
| { | ||
| Deletions = new List<ResourceRecordSet> { match } |
| <PackageReference Include="Keyfactor.AnyGateway.IAnyCAPlugin" Version="3.3.0" /> | ||
| <PackageReference Include="Keyfactor.Logging" Version="1.3.0" /> | ||
| <PackageReference Include="Keyfactor.PKI" Version="8.3.1" /> | ||
| <PackageReference Include="Keyfactor.AnyGateway.IAnyCAPlugin" Version="3.1.0" /> |
Comment on lines
+538
to
+539
| await dnsProvider.CreateRecordAsync(validation.DnsRecordName, validation.DnsRecordValue); | ||
| createdRecords.Add(validation.DnsRecordName); |
| Comments = "Ns1 DNS: Api Key only if Using Ns1 DNS (Optional)", | ||
| Hidden = true, | ||
| DefaultValue = "", | ||
| Type = "String" |
Comment on lines
+80
to
+81
| var rrsetsRequest = _dnsService.ResourceRecordSets.List(_projectId, zone.Name); | ||
| var rrsets = await rrsetsRequest.ExecuteAsync(); |
| Name = formattedName, | ||
| Type = "TXT", | ||
| Ttl = 60, | ||
| Rrdatas = new List<string> { $"\"{txtValue}\"" } |
Comment on lines
+170
to
+172
| var zonesRequest = _dnsService.ManagedZones.List(_projectId); | ||
| var zonesResponse = await zonesRequest.ExecuteAsync(); | ||
| var zones = zonesResponse.ManagedZones; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


Merge release-1.3 to main - Automated PR