- fix(enroll): Pickup now waits briefly and returns the issued certificate in-band when the CA issues fast, otherwise returning pending as before (
PickupRetriesdefault 5,0disables;PickupDelaydefault 10s). - fix(enroll): SANs are now read from every key the gateway sends (including
dnsname), and from the CSR when it sends none, so UCC certificates return all domains. - fix(enroll): Renewal SANs now come from the renewal request (subject CN, request SANs or CSR), not the prior order.
- fix(enroll): Orders auto-approved by CERTInext before issuance completes now return pending; the next sync picks up the certificate.
- fix(enroll): Renewals now use the template's product code instead of always using
DefaultProductCode. - fix(enroll): A blank
RequestorNameorSignerPlacenow sends the placeholdersKeyfactor GatewayandGatewayinstead of an empty subscriber agreement signer. - fix(enroll):
SignerName,SignerPlace, andSignerIptemplate parameters now override connector values for the subscriber agreement on new orders and renewals. - fix(enroll): A
SignerIpthat is not a valid IP address now logs a Warning naming whether it came from the template or the connector; the value is still sent unchanged. - fix(enroll): A Warning is now logged when
SignerNameorSignerPlacefall back to their placeholders, naming what to set. - fix(enroll):
GroupNumber,AutoSecureWww, and the technical contact now send in the correct request fields CERTInext reads. - fix(enroll): Renewals no longer fail with
EMS-918: Additional Information cannot be empty; the renewal order now sendsadditionalInformation.remarks. - fix(enroll): Renewals now send the full order details (group,
AutoSecureWww, technical contact, organization, remarks), matching a new enrollment. - fix(enroll): A failed status check or DCV step after placing an order now returns pending with the order number so sync can finish the order and a retry cannot place a duplicate.
- fix(enroll): Non-DNS SANs (IP, email, URI) are now submitted instead of silently dropped; set
SubmitNonDnsSanstofalseto restore the old behavior. - fix(enroll): Order/CSR submissions no longer auto-retry after a timeout so a timeout cannot create a duplicate order; if the CA did create one, the next sync imports it.
- fix(enroll):
www.is no longer added to orders by default becauseAutoSecureWww(default0) is now honored; set it to1to keep the old behavior. - fix(enroll): Orders now route to the configured
GroupNumber, which previously was not applied to orders. - fix(enroll): Renewals now follow the connector's
SubscriptionAutoRenew,EmailNotifications, and validity settings instead of fixed 1-year validity with auto-renew and notifications on. - fix(enroll): The
ValidityYearstemplate parameter now takes effect, and the order term is the larger ofValidityYearsandValidityDays(rounded up to years) so templates saved with onlyValidityDayskeep their term. - fix(enroll): The technical contact is omitted, with a Warning, when no contact name or email resolves, since CERTInext requires both once the block is sent.
- fix(logging): The V1 API error log line now reads
CERTInext API non-success. Operation=...instead ofCERTInext API error during ...; update any log alerts keyed on the old text. - fix(dcv): A DV order that cannot issue (IP or email SAN, no DNS provider) now returns pending immediately; sync finishes the order.
- fix(dcv): A DV renewal waiting on DNS-01 validation now returns pending immediately instead of blocking a gateway worker for the pickup wait.
- fix(config): Connector and template validation no longer leaks an HTTP client per check.
- fix(sync): Sync holds back pending or issued orders created in the last 120 s (
SyncRecentOrderGraceSeconds,0disables), making a duplicate-key failure on an in-flight enrollment's save much less likely; enrollments longer than about 2 minutes can still race.
- chore(logging): Startup log now shows whether
OrganizationNumber,DefaultProductCode,GroupNumber,SubmitNonDnsSans, andLogSensitiveRequestDataare set, and warns whenLogSensitiveRequestDatais on. - chore(config): Field descriptions and configuration docs now match the code for
DefaultProductCode,ValidityYears, signer fallbacks,LogSensitiveRequestData, and the pickup clamps. - chore(config): Corrected the
AutoApprovetemplate setting's description, which previously implied the plugin attempts automatic approval of pending certificates. - chore(tests): Opt-in live sandbox test that renews through
plugin.Enroll(RenewOrReissue)end to end (CERTINEXT_RENEWAL_E2E=1).
Initial release of the CERTInext (emSign Hub) AnyCA REST Gateway plugin.
- feat(enroll): Certificate enrollment for CERTInext SSL products — DV, OV, and EV SSL, including Wildcard and Multi-Domain (UCC) variants — with connector- and template-level overrides for product code, requestor identity, organization/group, and validity.
- feat(dcv): End-to-end DNS-01 domain validation for DV SSL through a pluggable
IDomainValidatorFactory(Cloudflare provider included). Publishes the TXT challenge, asks CERTInext to verify, waits for issuance, and returns the issued certificate directly fromEnroll. (DCV build — AnyCA Gateway 26.x.) - feat(sync): Full and incremental CA synchronization via paginated
GetOrderReport. Issued certificates carry their full PEM body; revoked certificates carry revocation metadata. - feat(sync): Sync-driven DCV retry drives orders left pending validation to completion on later sync passes, bounded by configurable
DcvSyncMaxOrderAgeHoursandDcvSyncMaxPerPasscaps so large accounts stay fast. - feat(revoke): Certificate revocation via
RevokeOrderwith RFC 5280 reason-code mapping. - feat(auth): AccessKey (HMAC-SHA256) and OAuth client-credentials authentication modes.
- feat(build): Single
DcvSupportMSBuild flag selects the host-matched build from one codebase — default no-DCV (IAnyCAPlugin3.2.0, AnyCA Gateway 25.5.x) or-p:DcvSupport=truefor the DCV build (IAnyCAPlugin3.3.0-PRERELEASE, 26.x). Records persist only when the build matches the host's IAnyCAPlugin version. - feat(config): Connector-level configuration for pre-vetted organization/group/technical-contact injection, DCV timing knobs (challenge/issuance waits), and SSL order defaults.
- feat(sync):
IgnoreExpiredflag to exclude expired certificates from synchronization.
- fix(sync): Issued certificates now synchronize with their full PEM body — the
GetOrderReportlisting carries no body, so the plugin refetches the full certificate for issued/revoked records. Previously issued certs synced empty and never appeared in Command. - fix(sync): Preserve listing metadata (
Subject,ProductID, order date) when refetching the certificate body during synchronization, so issued records are not emitted with null fields. - fix(diagnostics): Every CERTInext API failure logs the HTTP status plus the CA's error code and message; transient rate-limit responses are retried with exponential backoff and jitter.
- chore(crypto): All cryptographic operations (CSR/key generation, hashing, the auth nonce) use BouncyCastle exclusively — no
System.Security.Cryptography. - chore(deps):
BouncyCastle.Cryptography2.6.2 (closes 3 moderate-severity CVEs). - chore(compat): Ship builds for both
net8.0andnet10.0. - chore(logging): Verbose Debug/Trace logging across the sync flow with method entry/exit tracing.
- chore(tests): Live integration tests covering all supported SSL/TLS product types, the DCV enroll → issue → sync flow, and a key-algorithm matrix — confirms CERTInext issues RSA 2048/3072/4096 and ECC P-256/P-384, and rejects larger RSA, ECC P-521, and Ed25519/Ed448.
- chore(scripts): API smoke-test scripts for every endpoint, including
reject-order/reject-all-pendingfor cancelling pending orders.