| Internet-Draft | ANS v2 | April 2026 |
| Courtney, et al. | Expires 15 October 2026 | [Page] |
Autonomous AI agents execute transactions across organizational boundaries. No single agent platform provides the trust infrastructure they need. This document defines the Agent Name Service (ANS) v2 protocol, which anchors every agent identity to a DNS domain name. A Registration Authority (RA) verifies domain ownership via ACME, issues dual certificates (a Server Certificate from a public CA and an Identity Certificate from a private CA binding a version-specific ANSName), and seals every lifecycle event into an append-only Transparency Log aligned with IETF SCITT. Three verification tiers -- Bronze (PKI), Silver (PKI + DANE), and Gold (PKI + DANE + Transparency Log) -- let clients choose assurance levels appropriate to transaction risk.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 15 October 2026.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document.¶
AI agents now buy supplies, book travel, and sign contracts without a human in the loop. The ones handling real money need proof of who stands behind them. DNS [RFC1035] maps names to addresses but does not verify identity or track software versions. DNS-SD [RFC6763] adds service discovery but cannot tell a client whether the agent at an address is the one it claims to be.¶
Two prominent protocols define how agents communicate. MCP [MCP] connects models to local tools and external APIs. A2A [A2A] governs how autonomous agents negotiate and delegate tasks across organizational boundaries. These protocols define how agents communicate but explicitly defer the question of who the agent is and whether it should be trusted.¶
ANS addresses these gaps by combining three mechanisms. First, the agent's identity is anchored to a domain name whose ownership the Registration Authority (RA) has verified. Second, every change to the agent's software produces a new version number and a new Identity Certificate, recording which version is registered. Third, every lifecycle event is sealed into a Transparency Log, an append-only ledger where entries cannot be altered or removed after the fact. The three mechanisms together prove which version was declared and when.¶
This document builds on "Agent Name Service (ANS): A Universal Directory for Secure AI Agent Discovery and Interoperability" [ANSv1], published at IEEE ICAIC 2026 and contributed to the IETF as an Internet-Draft. The original paper proposed a conceptual architecture with a six-component ANSName format. The architecture presented here simplifies the ANSName to three components (ans://v{version}.{agentHost}), introduces a dual-certificate model, replaces conceptual registry integrity with a cryptographic Transparency Log, moves protocol adapters to a client SDK, and decouples discovery from the RA.¶
HCS-14 [HCS14] uses DNS TXT records for agent discovery; an ANS Profile for HCS-14 allows any HCS-14 resolver to discover ANS agents. HCS-27 [HCS27] defines a checkpoint format for publishing the Transparency Log's root hash to a distributed consensus topic. The IETF SCITT working group [I-D.ietf-scitt-architecture] defines an append-only transparency service; the ANS TL follows this model. DNS-AID [DNSAID] uses SVCB service binding records [RFC9460] for agent endpoint discovery; DNS-AID tells a client where to connect, ANS tells it whether to trust the agent.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
The architecture connects a central Registration Authority with Agent Hosting Platforms and shared internet infrastructure. Two chokepoints define trust flow: the RA, where identity enters the system, and the Transparency Log, where sealed evidence leaves it.¶
The RA system comprises:¶
The AHP hosts the agent's code and serves the live endpoints at the agent's FQDN. During registration, the AHP responds to ACME challenges so the RA can verify domain control, then receives both certificates and installs them in its keystore. The AHP provisions DNS records using content the RA generates. When the agent's code changes, the AHP initiates a new version registration.¶
The TL receives signed events from the RA, validates each signature, and seals the events into a cryptographic append-only structure. That structure produces two kinds of proof: inclusion proofs (proving a specific event exists in the log) and consistency proofs (proving the log has only grown, never shrunk or rewritten). The KMS signs each checkpoint. A conforming TL MUST operate as a SCITT Transparency Service [I-D.ietf-scitt-architecture], issuing binary COSE receipts as proof of inclusion.¶
A conforming TL MUST expose a REST API for external verifiers:¶
| Endpoint | Purpose |
|---|---|
| GET /v1/agents/{agentId} | Sealed event, TL signature, and inclusion proof |
| GET /v1/agents/{agentId}/audit | Paginated history of all lifecycle events |
| GET /v1/log/checkpoint | Latest signed checkpoint: log size, root hash, KMS signature |
| GET /v1/log/checkpoint/history | Checkpoint history for consistency proof verification |
| GET /v1/log/schema/{version} | JSON Schema definition for a given event schema version |
| GET /root-keys | KMS verification keys, including historical keys |
The TL MUST distribute verification keys via /root-keys so that any verifier can check root signatures without contacting the RA. Verification MUST NOT require access to producer public keys, authentication for read-only operations, or knowledge of RA implementation details.¶
The RA answers one question: "Who are you?" Three layers of trust data together provide a complete answer.¶
No single source controls the evaluation. A companion Trust Index specification defines how a provider consumes sealed data from Layer 1 and external signals from Layers 2 and 3, computes a multi-dimensional trust evaluation, and returns it as a signed credential.¶
The canonical identifier for a registered agent has three components ([RFC1035], [RFC1123]):¶
ANSName = "ans://v" version "." agentHost version = 1*DIGIT "." 1*DIGIT "." 1*DIGIT agentHost = <FQDN per RFC 1035 and RFC 1123>¶
Example: ans://v1.0.0.sentiment-analyzer.example.com¶
| Component | Example | Constraints |
|---|---|---|
| protocol | ans | Fixed. Always "ans". |
| version | 1.0.0 | Semantic version, numeric only: major.minor.patch. The "v" prefix is a literal part of the ANSName syntax, not part of the version string. |
| agentHost | sentiment-analyzer.example.com | FQDN per RFC 1035 and RFC 1123. MUST NOT exceed 237 octets. |
The 237-octet host limit: The RA derives DNS record names by prepending labels to the agentHost. The longest derived name is _acme-challenge.{agentHost}, consuming 17 octets (16 characters plus the label separator) of the 253-octet presentation-format domain name limit (RFC 1035 Section 2.3.4, RFC 1123 Section 2.1). 253 - 16 = 237.¶
The complete ANSName MUST NOT exceed 400 octets, providing headroom for safe transport across HTTP headers, TLS fields, and database columns.¶
| Identifier | Assigned by | Mutable | Purpose |
|---|---|---|---|
| ANSName | Derived | No | Which version is registered on which domain |
| FQDN | AHP | No | Stable domain across all versions |
| Agent ID | RA | No | Registration record's unique key |
| ProviderID | RA | No | Who controls the domain |
| Supersedes ID | RA | No | Previous version's record |
| Certificate | Issued by | SAN type | Purpose |
|---|---|---|---|
| Server | Public CA | dNSName | Standard TLS for the stable FQDN |
| Identity | Private CA | URI SAN | Binds certificate to a versioned ANSName |
The Identity Certificate requires a URI SAN. The ans:// scheme is syntactically valid per RFC 3986 [RFC3986] Section 3.1 and permitted in URI SANs per RFC 5280 [RFC5280] Section 4.2.1.6.¶
The RA tracks registration state in its database. Only certain transitions produce TL events: entering ACTIVE, DEPRECATED, REVOKED, or EXPIRED, and renewal while ACTIVE (the AGENT_RENEWED event type). RENEWED is a TL event type, not a distinct registration state; the agent remains ACTIVE throughout the renewal process.¶
| State | Description |
|---|---|
| PENDING | Awaiting validation |
| PENDING_DNS | Domain validated; awaiting DNS record verification |
| ACTIVE | Operational |
| DEPRECATED | Signals consumers to migrate |
| REVOKED | Certificates invalidated (terminal) |
| EXPIRED | Requires renewal (terminal) |
| Requirement | Standard | Rule |
|---|---|---|
| Canonicalization | JCS (RFC 8785) | All JSON MUST be canonicalized before signing or hashing |
| Signature format | JWS Detached | Payload is not embedded; signatures stored separately |
| Algorithm | ES256 (ECDSA P-256/SHA-256) | Default. MUST support algorithm agility. |
| Wire format | JWS Compact | <header>..signature (two dots; detached payload) |
Every signature MUST include protected headers: alg (signing algorithm), kid (key identifier), typ (type indicator), timestamp (Unix timestamp), and raId (RA instance identifier). All JSON payloads MUST be canonicalized per JCS [RFC8785] before signing. Signatures use JWS Compact Serialization [RFC7515] with the JSON data interchange format [RFC8259].¶
A client verifies an agent through independent checks, each using a different trust channel:¶
| Step | Check | Trust channel |
|---|---|---|
| 1 | PKI certificate validation | CA system |
| 2 | DANE record validation | DNS (DNSSEC) |
| 3 | TL verification | TL (KMS-signed) |
| Tier | Steps | Shorthand |
|---|---|---|
| Bronze | 1 | PKI only |
| Silver | 1-2 | PKI + DANE |
| Gold | 1-3 | PKI + DANE + TL |
A tier describes what the client verified, not a property the RA assigned. The RA specifies TLSA 3 0 1 [sha256_hash]: DANE-EE (usage 3), full Server Certificate (selector 0), SHA-256 (matching type 1) [RFC6698].¶
DANE requires DNSSEC [RFC4033]. Per RFC 6698 Section 4, a TLSA RRset whose DNSSEC validation state is not "secure" MUST be treated as unusable, and the client falls back to standard PKIX certificate validation.¶
The mTLS handshake proceeds as follows:¶
When the agent's ANS Trust Card carries a stapled SCITT receipt, the caller verifies locally with no TL call.¶
When an agent acts on behalf of a human, the agent proves its own identity via mTLS. The human's authorization travels separately as a delegation token [RFC8693].¶
The RA never generates, handles, or accesses an agent's private keys. The AHP owns its key lifecycle. Each RA instance MUST register at least one active public key with the TL before submitting events. Rotation uses an overlap window: new keys are registered with future validFrom dates; both old and new remain active during the transition. Historical signatures remain valid after key expiration but not after revocation.¶
Query privacy is out of scope for the RA. Discovery Services SHOULD implement privacy-preserving techniques (Private Information Retrieval, Anonymized Query Relays).¶
The TLS handshake reveals the agent's hostname to network observers. Encrypted Client Hello (ECH, RFC 9849) [RFC9849] encrypts the inner ClientHello, hiding the hostname. When an AHP provides an ECH configuration during registration, the RA publishes it in the HTTPS record.¶
Registration has two stages:¶
The AHP submits a registration request containing:¶
All validations must pass before activation: domain control (ACME DNS-01 or HTTP-01), organization identity (when applicable), schema integrity (fetch and hash), and DNSSEC presence (advisory).¶
The activation sequence, irreversible once step 4 completes:¶
| Operation | Trigger | TL Event | DNS Effect |
|---|---|---|---|
| Version bump | Code/config change | AGENT_REGISTERED | New per-version records |
| Renewal | Certificate expiring | AGENT_RENEWED | None |
| Revocation | Agent shutdown | AGENT_REVOKED | Per-version removed |
The RA generates record content for child labels under the agent's FQDN:¶
| Record | Label | Type | Purpose |
|---|---|---|---|
| Discovery | _ans.{host} | TXT | Protocol and metadata location |
| Badge | _ans-badge.{host} | TXT | TL badge URL for verification |
| DANE | _443._tcp.{host} | TLSA | Server Cert fingerprint |
| HTTPS | {host} | HTTPS | ALPN hints, ECH parameters |
| Identity DANE | _ans-identity._tls.{host} | TLSA | Identity Cert fingerprint |
The _ans TXT record is a connection hint published in DNS:¶
_ans.{agentHost} IN TXT
"v=ans1; version=v1.0.0; p=a2a;
url=https://agent.example.com/.well-known/agent-card.json"
¶
The _ans-badge TXT record points to the version's badge in the TL:¶
_ans-badge.{agentHost} IN TXT
"v=ans-badge1; version=v1.0.0;
url=https://{tl_host}/v1/agents/{agentId}"
¶
An AIM MUST distinguish between "Unreachable" (transient network failure, retry later) and "Mismatch" (the content has changed, remediation needed).¶
| Check | What the AIM does | Pass condition |
|---|---|---|
| DNS pointer | Authoritative query for _ans and _ans-badge with DNSSEC | Records exist and validate |
| Trust Card integrity | Fetch Trust Card, hash content | Hash matches sealed agentCardHash |
| Schema integrity | Fetch each schema.url, hash content | Hash matches schema.hash in Trust Card |
An ANS Profile within HCS-14 allows resolvers to verify ANS DNS records, certificates, and log proofs through a standard interface without ANS-specific branching.¶
A companion specification [HCS27] defines a checkpoint format for publishing the TL's root hash to a distributed consensus topic. The timestamp is independently verifiable, strengthening the guarantee that historical log entries have not been backdated or rewritten.¶
The SCITT architecture [I-D.ietf-scitt-architecture] defines an append-only transparency service that accepts signed statements, registers them, and returns receipts. The ANS TL follows this model. A future goal is formal SCITT compliance, adopting COSE (RFC 9052) [RFC9052] signed statements and standardized receipt formats.¶
The same RA, TL, and certificate infrastructure can run at different scopes:¶
A domain owner can publish DNS-AID SVCB records [DNSAID] [RFC9460] alongside _ans TXT records. The two record families occupy different DNS names and do not collide.¶
A sealed event carries two independent proofs of existence, each anchored to a different trust root.¶
Layer 1 (Transparency Log): Let E be a lifecycle event sealed at leaf index i in a log of size n with Merkle root R. An inclusion proof consists of a hash path of length ceil(log2(n)). The proof is valid iff recomputing the root from LeafHash(E), the path, and i yields R, and the signature over R verifies against the TL's published KMS key.¶
Layer 2 (Consensus Checkpoint): An HCS-27 checkpoint publishes R to a distributed consensus topic at timestamp T. Together, the two layers guarantee: inclusion, non-repudiation (removing E after checkpoint publication contradicts the collision resistance of SHA-256), and temporal binding (the consensus topic provides independently verifiable timestamps).¶
The protocol distributes trust across four services. No service accepts another's assertions without verifying a cryptographic signature.¶
| Boundary | Verification | What compromise means |
|---|---|---|
| RA to TL | TL verifies producer signature (ES256, registered key) | Forged event rejected at ingestion |
| TL to Verifier | Verifier checks KMS signature on checkpoint | Tampered checkpoint fails validation |
| TL to Event Stream | Each event carries the producer's signature | Fabricated event fails signature check |
| AIM to RA | RA re-verifies each finding against TL records | False finding detected on re-verification |
This section addresses threats identified through a MAESTRO framework analysis applied to the ANS architecture.¶
Risk: An adversary impersonates a legitimate agent. Mitigation: Mandatory PKI with dual certificates. The Identity Certificate binds a specific code version to a verified domain. The agent must prove possession of the private key.¶
Risk: An adversary injects malicious data into the registry. Mitigation: The Transparency Log makes all sealed entries immutable and tamper-evident. The RA validates all payloads before sealing. The AIM continuously compares live state against sealed records.¶
Risk: An adversary modifies communications between components. Mitigation: Message integrity via digital signatures (JWS Detached). mTLS between agents using Identity Certificates. DANE provides a second trust channel independent of the CA system.¶
Risk: Adversary incapacitates RA, TL, or resolution services. Mitigation: The data plane (mTLS handshakes between agents) continues during RA or AIM outages. Previously established trust proofs remain valid until certificates expire.¶
Risk: An adversary modifies or deletes historical TL entries. Mitigation: Merkle tree structure makes tampering mathematically detectable via consistency proofs. KMS key separation ensures the signing key does not reside on the TL host. HCS-27 checkpoint anchoring to a public distributed ledger provides independently verifiable timestamps.¶
Risk: A single RA instance is breached. Mitigation: Every TL entry records the raId of the processing instance. Auditors isolate every event that instance touched. Separation of duties requires the RA's DNS permissions exclude TLSA write access.¶
For a given registration, the same entity may operate both the RA and the TL. HCS-27 consensus checkpoints are the primary mitigation: the TL's root hash is anchored to an independently verifiable ledger. Federation adds a second layer: an agent can register with an RA operated by one entity and have events sealed by a TL operated by another.¶
This document has no IANA actions at this time.¶
Future revisions may request registration of the "ans" URI scheme with IANA per RFC 7595, and registration of underscore labels "_ans", "_ans-badge", and "_ans-identity" per RFC 8552.¶
All examples follow one agent, "Acme Support Agent" (support.example.com, version 1.5.0), through the registration lifecycle. CSRs and signatures are truncated for brevity.¶
{
"agentDisplayName": "Acme Support Agent",
"agentDescription": "Customer support agent.",
"version": "1.5.0",
"agentHost": "support.example.com",
"endpoints": [
{
"protocol": "A2A",
"agentUrl": "wss://support.example.com/a2a",
"metadataUrl":
"https://support.example.com/.well-known/agent-card.json",
"transports": ["STREAMABLE-HTTP", "SSE"],
"functions": [
{ "id": "lookupOrder", "name": "Lookup Order",
"tags": ["order", "support"] }
]
}
],
"identityCsrPEM": "-----BEGIN CERTIFICATE REQUEST-----
...(truncated)...
-----END CERTIFICATE REQUEST-----",
"serverCsrPEM": "-----BEGIN CERTIFICATE REQUEST-----
...(truncated)...
-----END CERTIFICATE REQUEST-----",
"lei": "549300EXAMPLE00LEI17"
}
¶
{
"ansId": "550e8400-e29b-41d4-a716-446655440000",
"ansName": "ans://v1.5.0.support.example.com",
"eventType": "AGENT_REGISTERED",
"agent": {
"host": "support.example.com",
"name": "Acme Support Agent",
"version": "v1.5.0",
"providerId": "PID-8294",
"lei": "549300EXAMPLE00LEI17"
},
"attestations": {
"identityCert": {
"fingerprint": "SHA256:22b8a804...",
"type": "X509-OV-CLIENT"
},
"serverCert": {
"fingerprint": "SHA256:d2b71bc0...",
"type": "X509-DV-SERVER"
},
"domainValidation": "ACME-DNS-01",
"dnssecStatus": "fully_validated"
},
"issuedAt": "2026-03-05T18:00:00.000000Z",
"raId": "id-A",
"timestamp": "2026-03-05T18:00:00.000000Z"
}
¶
$ORIGIN support.example.com.
$TTL 3600
; Core Location Records (Managed by AHP)
@ IN A 192.0.2.50
@ IN AAAA 2001:db8::50
; RA generates; AHP provisions
@ IN HTTPS 1 . alpn="h2"
_443._tcp IN TLSA 3 0 1 <sha256_of_server_cert>
_ans IN TXT "v=ans1; version=v1.5.0; p=a2a;
url=https://support.example.com/.well-known/agent-card.json"
_ans-badge IN TXT "v=ans-badge1; version=v1.5.0;
url=https://{tl_host}/v1/agents/{agentId}"
; High-assurance (AHP-managed, per ADR 010)
_ans-identity._tls IN TLSA 3 0 1 <sha256_of_identity_cert>
¶