How to Verify E2EE in NFLTR

Use this guide to confirm that a tunnel is really running in verified mode at the NFLTR relay, that the verified hostname points at the identity you expect, and that the proof artifacts match the agent fingerprint you trust. It starts with the plain-language version first.


What this guide covers

This tutorial is for the browser-facing verified tunnel flow: nfltr http --mode verified or the legacy --e2ee spelling.

Note on trust: NFLTR is preparing the agent for open-source publication. Once published, you can audit the code to verify how fingerprints are generated and reported.

WireGuard and P2P are also end-to-end encrypted, but they use different verification surfaces.

Minimal Verification Story

Think of a verified NFLTR tunnel like a locked truck:

If you only want the simple version, check these three things:

CheckPlain-English meaningWhy it matters
The tunnel says VerifiedYou started the tunnel in verified mode.NFLTR should be forwarding encrypted traffic, not inspectable HTTP.
The proof JSON says blind_relay: trueThe public proof endpoint says the NFLTR relay is classifying this route as agent-terminated TLS.This is the server's public statement about route mode at the NFLTR layer.
tls_fingerprint in the proof JSON matches the agent fingerprintThe proof is talking about the same certificate your agent is actually using.This confirms identity continuity for the certificate serving the route.
The short answer

If those three things line up, you have strong evidence that NFLTR itself is routing the endpoint in verified mode and that the proof artifacts describe the same certificate identity your agent started with. If you only do one technical check, do the fingerprint match.

Why this proof works

  1. Fingerprint matching is hard to fake because changing TLS identity means changing the private key. If the relay showed you a different fingerprint, it would be a different certificate identity. A matching fingerprint means the proof artifacts and the agent startup banner are talking about the same identity, not a substituted one.
  2. blind_relay: true is the relay's public claim about that same identity. The proof page is not asking you to trust an anonymous statement. It publishes blind_relay: true alongside the exact tls_fingerprint you matched, so the route-mode claim is tied to the same TLS identity you started the tunnel with.
  3. What you are verifying is the link between identity and claim. Matching fingerprints means same identity. blind_relay: true means that identity is claiming NFLTR did not read HTTP content for this route.
  4. The agent honestly reports its fingerprint. The agent binary (or source code once publication is available) prints the real fingerprint of the TLS certificate it is using. As open-source artifacts roll out, you can audit this behavior and verify reproducible builds match the source.

Why you should trust this

What is proven

What is not proven

Common confusion

"The fingerprint match means the same identity. Blind relay is what that identity claims."

If the operator breaks that promise later, the identity or the proof state would need to change, and you would have evidence that something changed. However, if the tunnel is restarted, the fingerprint may be different (new certificate), so you would be verifying a different identity than before. Each tunnel session has its own fingerprint-to-claim verification.

What You Are Verifying

SignalWhere to checkWhat it proves
Verified mode badgeCLI banner and dashboardThe tunnel is configured for verified mode rather than inspectable HTTP.
Verified E2EE Hostname = readyDashboard Route CatalogA stable verified hostname is published for this agent.
blind_relay: truePublic proof JSONThe server classifies this route as an agent-terminated TLS path at the NFLTR layer.
trust_state: Transparency VerifiedProof page or proof JSONThe identity is present in the transparency log and the append-only transparency chain verified.
tls_fingerprint matches the CLI bannerAgent startup output + proof JSONThe proof artifacts refer to the same TLS identity the agent generated or loaded.
Traffic Inspector stays emptyDashboard Traffic panelThe NFLTR relay did not capture plaintext HTTP for this verified route.

Prerequisites

  1. The agent is running with --mode verified or --e2ee.
  2. The server has a verified base domain configured if you want a stable hostname:
    --e2ee.tls_passthrough.base_domain=secure.example.com
  3. Your wildcard DNS already points at the relay.

If the verified hostname is missing or stuck in configure state, use Cloudflare DNS Helper first.


1. Start a Verified Tunnel

# local test service
python3 -m http.server 3000

# verified tunnel
nfltr http 3000 --mode verified --name demo-app --no-share

In the CLI output, confirm all of these are present:

Save the fingerprint

Keep the SHA-256 fingerprint printed by the agent. You will compare it to the proof JSON later to confirm identity continuity.


2. Check the Dashboard

Open the dashboard and find the agent card.

You want to see:

You should also expect the opposite of inspectable mode behavior: Traffic Inspector stays empty because the relay cannot inspect plaintext traffic.


3. Open the Public Proof Artifacts

For an agent named demo-app, the three proof endpoints are:

https://your-server.example/proof/demo-app
https://your-server.example/proof/demo-app.json
https://your-server.example/proof/demo-app.zip

The JSON endpoint is the easiest place to verify raw facts. A healthy verified tunnel looks like this:

{
  "agent_id": "demo-app",
  "verified_hostname": "https://demo-app.secure.example.com/",
  "blind_relay": true,
  "trust_state": "Transparency Verified",
  "transparency_logged": true,
  "chain_verified": true,
  "tls_fingerprint": "AA:BB:CC:..."
}

Check these fields:

  1. verified_hostname is present and points at the hostname users should visit.
  2. blind_relay is true, meaning the NFLTR relay is classifying this route as agent-terminated TLS.
  3. transparency_logged is true.
  4. chain_verified is true when the full append-only transparency log chain verified.
  5. tls_fingerprint matches the fingerprint printed by the agent when it started.

4. Download the Proof Bundle

The proof bundle is the durable audit artifact you can save alongside a deployment, security review, or customer handoff.

It contains:

If you need to prove what identity was live at a specific point in time, the ZIP is the easiest artifact to keep.


5. Understand the Trust States

Trust stateMeaningWhat to do
Transparency VerifiedThe current identity is in the transparency log and the append-only transparency chain verified successfully.This is the strongest verification result.
Transparency LoggedThe identity is present in the transparency log, but this view did not confirm the stronger full-chain transparency result.Usually acceptable; check the proof page or JSON for the stronger chain result.
TOFU / Fingerprint PinningNo matching transparency entry was available.Compare and pin the fingerprint directly, or use a CA-backed certificate.
ACME ProvisioningThe agent requested a public certificate but issuance is still in progress.Wait for issuance to complete before treating the route as fully verified.

In practice, the dashboard often shows Transparency Logged, while the public proof page or JSON can upgrade that result to Transparency Verified after a full chain check.


6. What Fingerprint Matching Actually Proves

Fingerprint matching is an identity check, not a complete proof about every hop on the network path.

SignalMeaning
Fingerprint matchesThe proof artifacts and the CLI banner are talking about the same TLS certificate identity.
Fingerprint matchesThe verified hostname is expected to terminate TLS at that agent when the hostname reaches the agent directly.
Still possibleA CDN or reverse proxy in front of nfltr.xyz can still terminate the outer TLS connection and inspect plaintext before it reaches NFLTR.
Still visibleThe relay can still see hostname, timing, client IP, and byte counts even in verified mode.

7. Optional Advanced Check: Verify the Agent Source Code

If you want the strongest possible verification, you can audit the agent source code and build from source instead of using a binary.

Why this matters: The verification flow relies on the agent honestly reporting its TLS certificate fingerprint. During open-source rollout, you can:

Steps:

  1. Clone the agent repository (URL to be added when agent is open-sourced)
  2. Review cmd/nfltr/main.go and related certificate handling code
  3. Build from source:
    go build -o nfltr ./cmd/nfltr
  4. Run your own build and compare the fingerprint output to the official proof page
  5. Verify reproducible builds: Compare binary hash to official release builds

This removes the need to trust a closed-source binary — you can verify the behavior directly from the code.


8. Optional Advanced Check: Compare the Certificate Directly

Only do this when the verified hostname exposes the agent's certificate directly. If a CDN or reverse proxy terminates TLS in front of the relay, use the proof JSON and proof bundle as your trust anchor instead.

openssl s_client \
  -connect demo-app.secure.example.com:443 \
  -servername demo-app.secure.example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -fingerprint -sha256

Compare the printed fingerprint to tls_fingerprint in the proof JSON.


9. Troubleshooting

SymptomLikely causeFix
Agent shows Inspectable instead of VerifiedThe tunnel was started without --mode verified or with --mode inspectable.Restart the tunnel in verified mode.
Verified hostname missinge2ee.tls_passthrough.base_domain is not configured.Configure the server flag and wildcard DNS.
Proof JSON has blind_relay: falseYou are checking a relay-visible route, not a verified route.Use the verified hostname and verified tunnel mode.
chain_verified is false but transparency_logged is trueThe identity is logged, but the stronger full-chain result was not available for that view.Refresh later or rely on the logged state plus the fingerprint.
Browser shows a certificate warningThe agent is using a self-signed certificate.This is normal for self-signed verified mode; compare the fingerprint instead of expecting a public CA padlock.
Traffic Inspector is emptyThe route is verified and the NFLTR relay did not see plaintext HTTP.No action needed.

Quick Checklist

  1. Start the tunnel with --mode verified.
  2. Save the fingerprint shown in the CLI banner.
  3. Confirm the dashboard shows Verified mode.
  4. Open /proof/<agent>.json and verify blind_relay = true and that the fingerprint matches the CLI output.
  5. If you want the stronger check, confirm the Route Catalog shows Verified E2EE Hostname in ready state and the proof JSON reports a good trust state.
  6. Download the proof bundle if you need a durable audit artifact.

Success Checklist

Related reading: