{"id":51488593,"url":"https://github.com/denuoweb/hns-dane-bootstrap-generator","last_synced_at":"2026-07-07T09:01:35.641Z","repository":{"id":368865454,"uuid":"1287151843","full_name":"denuoweb/hns-dane-bootstrap-generator","owner":"denuoweb","description":"Browser-based HNS/ICANN DNSSEC and DANE/TLSA record generator","archived":false,"fork":false,"pushed_at":"2026-07-06T15:33:31.000Z","size":274,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-06T17:14:14.668Z","etag":null,"topics":["dane","dane-tlsa","dns","dnssec","handshake","hns","https","spki","tls","tlsa","tlsa-records","x509"],"latest_commit_sha":null,"homepage":"https://hns.denuoweb.com/dane-generator/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/denuoweb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-02T12:30:14.000Z","updated_at":"2026-07-06T15:35:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/denuoweb/hns-dane-bootstrap-generator","commit_stats":null,"previous_names":["denuoweb/dane-record-generator","denuoweb/hns-dane-bootstrap-generator"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/denuoweb/hns-dane-bootstrap-generator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denuoweb%2Fhns-dane-bootstrap-generator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denuoweb%2Fhns-dane-bootstrap-generator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denuoweb%2Fhns-dane-bootstrap-generator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denuoweb%2Fhns-dane-bootstrap-generator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/denuoweb","download_url":"https://codeload.github.com/denuoweb/hns-dane-bootstrap-generator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denuoweb%2Fhns-dane-bootstrap-generator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35221308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dane","dane-tlsa","dns","dnssec","handshake","hns","https","spki","tls","tlsa","tlsa-records","x509"],"created_at":"2026-07-07T09:01:34.164Z","updated_at":"2026-07-07T09:01:35.627Z","avatar_url":"https://github.com/denuoweb.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# HNS DANE Bootstrap Generator\n\nA focused web app for producing the few records a domain owner needs to connect an HNS or ICANN domain to authoritative DNS, DNSSEC, and DANE/TLSA.\n\nThe app keeps the workflow simple:\n\n1. Enter domain, nameserver, server IP, and certificate/public key.\n2. Send generated records to the HNS wallet or ICANN registrar.\n3. Copy zone records onto the authoritative DNS server.\n4. Enable DNSSEC on the zone and publish the DS at the parent.\n5. Verify with the generated `dig`/`delv` commands.\n\n## Main outputs\n\n- **HNS wallet / registrar**: NS, GLUE, DS, and SYNTH records as appropriate.\n- **Authoritative DoH discovery**: RFC 9461 DNS-server SVCB records such as `_dns.ns1 IN SVCB 1 ns1 alpn=h2 dohpath=/dns-query{?dns}` for nameservers that also serve RFC 8484 DoH.\n- **Authoritative DNS server**: tabbed starter config for hosted DNS panels, Generic zone file, BIND, Windows Server DNS, PowerDNS, Knot, or NSD, including NS, A, AAAA, SVCB, and TLSA records.\n- **Verify commands**: `dig`/`delv` checks.\n- **Integrator JSON**: optional machine-readable output for wallets and future APIs.\n\n## Linode/Akamai appliance path\n\nThis repo now includes an early production-MVP appliance path for beginners who want a self-hosted authoritative DNSSEC + DANE server on a Linode they own:\n\n- `stackscripts/linode/hns-dane-appliance-bootstrap.sh` is a thin, hash-verified StackScript bootstrapper.\n- `appliance/install.sh` is the real versioned installer.\n- `/etc/hns-dane-appliance/config.json` is the server source of truth.\n- Knot DNS signs the authoritative zone with manual parent-facing rollover.\n- dnsdist exposes the Knot authoritative service as RFC 8484 DoH behind nginx `/dns-query`.\n- nginx serves a static dashboard with public GLUE, DS, TLSA, wallet instructions, and verification status.\n- private TLS/DNSSEC material and backups stay on the VPS, outside `/var/www`.\n- two-node reliable mode is documented as a future assisted flow and intentionally not claimed complete.\n\nStart with [Linode Beginner Deploy](docs/linode-beginner-deploy.md), [Publish The Linode StackScript](docs/linode-stackscript-publish.md), and [Appliance README](appliance/README.md). The appliance does not take payment, touch ICANN registrars, request wallet seeds, submit HNS transactions, or require Terraform/OpenTofu for the beginner path.\n\n## Supported modes\n\n### HNS delegated DNS mode\n\nFull DNSSEC + DANE path for a Handshake domain:\n\n```zone\n# HNS wallet / name resource\nNS ns1.dane.\nGLUE4 ns1.dane. 203.0.113.10\nDS 12345 13 2 7A1B...F09C\n\n# Authoritative DNS server\ndane. 3600 IN NS ns1.dane.\n_dns.ns1.dane. 3600 IN SVCB 1 ns1.dane. alpn=h2 dohpath=/dns-query{?dns}\ndane. 3600 IN A 203.0.113.20\n_443._tcp.dane. 3600 IN TLSA 3 1 1 9B2C...A811\n```\n\n### HNS SYNTH nameserver mode\n\nCompact HNS referral to an authoritative nameserver IP. The website address and TLSA record still live on the authoritative DNS server:\n\n```zone\n# HNS wallet / name resource\nSYNTH4 203.0.113.10\nDS 12345 13 2 7A1B...F09C\n\n# Authoritative DNS server\ndane. 3600 IN NS _pc0722g._synth.\ndane. 3600 IN A 203.0.113.20\n_443._tcp.dane. 3600 IN TLSA 3 1 1 9B2C...A811\n```\n\n### Authoritative DoH discovery\n\nFor delegated HNS nameserver setups, the generator emits RFC 9461 DNS-server SVCB records in the authoritative DNS zone when the delegated nameserver host is in-zone:\n\n```zone\n_dns.ns1.dane. 3600 IN SVCB 1 ns1.dane. alpn=h2 dohpath=/dns-query{?dns}\n```\n\nThis is still delegated DNS. The HNS parent resource proves the `NS`, `GLUE4`/`GLUE6`, and `DS` delegation; the signed authoritative zone advertises the nameserver's RFC 8484 DoH path. Website `A`/`AAAA`, HTTPS/SVCB, and TLSA records still live in the signed authoritative DNS zone and still validate against the HNS DS chain. RFC 9539 is a separate experimental specification for opportunistic recursive-to-authoritative DoT/DoQ on port 853, not an HNS TXT convention for DoH.\n\n### ICANN delegated DNSSEC mode\n\nRegistrar + DNSSEC setup:\n\n```text\n# Registrar / parent-zone panel\nNameserver: ns1.example.com.\nGlue IPv4: 203.0.113.10\nDS: 12345 13 2 7A1B...F09C\n\n# Authoritative DNS server\nexample.com. 3600 IN NS ns1.example.com.\nexample.com. 3600 IN A 203.0.113.20\n_443._tcp.example.com. 3600 IN TLSA 3 1 1 9B2C...A811\n```\n\n## TLSA behavior\n\nDefault TLSA output:\n\n```zone\nTLSA 3 1 1 \u003csha256-of-spki\u003e\n```\n\nInput accepted:\n\n- PEM `PUBLIC KEY`\n- PEM `CERTIFICATE`\n\nPrivate keys are not needed. The app extracts or accepts SubjectPublicKeyInfo and hashes it locally in the browser.\n\n## DNSSEC behavior\n\nPaste the zone DNSKEY after the authoritative DNS server signs the zone. The app computes DS digest type 2 by default:\n\n```zone\nDS \u003ckeytag\u003e \u003calgorithm\u003e 2 \u003csha256-digest\u003e\n```\n\nThe app does not sign zones and does not store private keys. DNSSEC signing remains the DNS server’s job.\n\n## Nameserver hostname walkthrough\n\nFor DANE setup, choose **Delegated authoritative DNS** when the wallet or registrar should point at a nameserver hostname. The practical setup is:\n\n1. Choose an authoritative DNS provider or run your own authoritative nameserver.\n2. Create the DNS zone for the HNS name or ICANN domain.\n3. Use the provider-assigned nameserver hostnames, or create an in-name hostname such as `ns1.dane.` / `ns1.example.com.`.\n4. If the nameserver hostname is inside the same name or zone, publish glue at the parent: `GLUE4`/`GLUE6` in HNS, or registrar glue for ICANN.\n5. Put the website `A`/`AAAA` records and `_443._tcp` `TLSA` record in the authoritative DNS zone.\n6. Enable DNSSEC signing on that authoritative zone.\n7. Publish the DS at the parent: HNS wallet/name resource for HNS, registrar/parent zone for ICANN.\n\nProvider fit matters. The DNS host must support authoritative DNS, DNSSEC signing, DS or DNSKEY export, and custom `TLSA` records. Cloudflare, Amazon Route 53, Google Cloud DNS, and DNSimple document DNSSEC plus TLSA-capable DNS paths. DigitalOcean DNS is not a fit for this DANE path as of its June 2026 docs because it does not support DNSSEC. Registrars such as Namecheap or GoDaddy may still be usable as the parent-side place to enter DS records while another DNS host serves the signed TLSA zone.\n\nFor self-hosted examples, see the Debian/BIND and Windows Server DNS quick starts in [Web Admin Guide](docs/WEB_ADMIN_GUIDE.md).\n\n## Operational requirements\n\nThis tool generates bootstrap records. A working delegated authoritative DNS and DANE deployment still depends on the operator running and validating the DNS service correctly.\n\n### Authoritative nameserver baseline\n\nIf you run your own authoritative nameserver:\n\n- Listen publicly on both UDP/53 and TCP/53.\n- Disable recursion on the authoritative service. Do not expose an open recursive resolver.\n- Allow DNS through the host firewall, network firewall, and hosting-provider security groups.\n- Keep the SOA serial increasing for every zone-file change.\n- Prefer at least two authoritative nameservers on separate hosts or networks.\n- Monitor DNSSEC signature freshness and re-sign before RRSIG expiration.\n- Publish authenticated denial of existence with NSEC or NSEC3, depending on the signer/server policy.\n\nThe server presets are starter snippets, not complete daemon hardening or service-management guides.\n\n### DNSSEC validation\n\n`dig +dnssec` shows DNSSEC records in the answer. It does not, by itself, prove that the delegation chain validates. After publishing the parent DS, also test with a validating resolver.\n\nFor ICANN DNS:\n\n```bash\ndelv example.com. A\ndelv _443._tcp.example.com. TLSA\ndig @\u003cvalidating-recursive-resolver\u003e _443._tcp.example.com. TLSA +dnssec\n```\n\nIn a validating `dig` response, confirm `status: NOERROR` and the `ad` flag. `SERVFAIL` commonly means a broken DNSSEC chain, expired signatures, unsupported algorithms, a wrong parent DS, or a missing DNSKEY/RRSIG/NSEC/NSEC3 record.\n\nFor HNS names, perform the same checks through an HNS-aware validating resolver after the wallet/name-resource update confirms:\n\n```bash\ndig @\u003chns-validating-recursive-resolver\u003e example. A +dnssec\ndig @\u003chns-validating-recursive-resolver\u003e _443._tcp.example. TLSA +dnssec\n```\n\n### DNSSEC signing lifecycle\n\nA production signer normally separates the key-signing key (KSK, usually flags 257) from the zone-signing key (ZSK, usually flags 256), though some managed systems hide that detail. Parent DS records are normally derived from the KSK. Keep the parent DS, child DNSKEY, and signed child zone in sync, and follow TTL-safe rollover order when changing keys:\n\n1. Publish the new DNSKEY in the child zone and wait for caches.\n2. Add or update the parent DS.\n3. Confirm validation succeeds.\n4. Remove old DNSKEY/DS material only after the old TTL and signature windows are safely past.\n\n### TLSA rollover\n\nThe default `TLSA 3 1 1` record pins the TLS service public key. If the web server changes to a new key before resolvers can see the new TLSA association, DANE-aware clients can fail authentication.\n\nSafe key rollover:\n\n1. Publish TLSA records for both the current key and next key.\n2. Wait at least the relevant DNS TTL and any operational cache window.\n3. Switch the TLS service to the new key/certificate.\n4. Verify live TLSA matching.\n5. Remove the old TLSA record after another TTL window.\n\n### Client support and service scope\n\nPublishing TLSA creates a DANE policy in DNS. It is enforced only by clients that validate DNSSEC and implement DANE checks. Mainstream HTTPS browser behavior is not uniform, so distinguish \"TLSA is published and signed\" from \"the client actually enforces DANE.\"\n\nThis package is apex-HTTPS focused by default, for example `_443._tcp.example.`. Other services need their own TLSA owners:\n\n- `www.example.` on HTTPS: `_443._tcp.www.example.`\n- SMTP over STARTTLS for an MX host: `_25._tcp.mail.example.`\n- IMAP over TLS: `_993._tcp.imap.example.`\n- SRV-based services: follow the service-specific DANE owner-name rules.\n\nSMTP DANE is a separate workflow defined by RFC 7672 and is not implemented by this generator yet.\n\n### Input correctness\n\nThe app computes DS from the DNSKEY you paste and TLSA from the PEM certificate or public key you paste. Before publishing:\n\n- Confirm the DNSKEY is from the exact signed child zone and normally from the KSK/SEP key.\n- Confirm the parent DS matches the active child DNSKEY after signing.\n- Confirm the certificate or PUBLIC KEY is the exact key served for the hostname, port, protocol, and SNI name represented by the TLSA owner.\n- Confirm the live service still presents a certificate chain compatible with the selected TLSA usage.\n\n## Internationalized domain names\n\nUnicode domain input is accepted when the browser can convert it through IDNA processing. Generated DNS, wallet, registrar, server, and verification output uses ASCII A-labels such as `xn--bcher-kva.example.`.\n\nThe app shell includes English, Spanish, French, German, Portuguese, Japanese, Arabic, Persian, and Hebrew UI localization. The language selector translates the interface; Arabic, Persian, and Hebrew use RTL page direction, while generated records and command snippets remain unchanged.\n\nSee [Internationalization standards](docs/I18N_STANDARDS.md) for the UI localization policy plus IDNA, Punycode, UTS #46, and future email internationalization references.\n\n## Input guidance\n\nThe app keeps setup guidance beside the field it explains:\n\n- **Domain type** explains the wallet/registrar versus authoritative DNS split.\n- **Setup mode** walks through delegated DNS versus HNS `SYNTH`, including nameserver hostname, glue, DNSSEC, DS, and TLSA placement.\n- **Domain** explains HNS slash form, ICANN DNS names, and IDNA handling.\n- **DNS server preset** explains when to use hosted DNS, generic zone files, or server-specific examples.\n- **Nameserver hostname** explains provider-assigned nameservers versus in-name `ns1.yourname.` hostnames that require glue.\n- **Nameserver IPv4** explains `SYNTH4` and `GLUE4` nameserver address use.\n- **Website IPv4** explains that website `A` records are separate from nameserver `SYNTH`/glue.\n\n### DNS server preset\n\nUse **Hosted DNS provider panel** if your provider supports DNSSEC signing, DS or DNSKEY export, and custom TLSA records. Use **Generic zone file** when adapting records into another authoritative server. Use **BIND 9** for a Debian/Linux quick start. Use **Windows Server DNS** for PowerShell-driven Windows Server setup. Use **PowerDNS** when you want API/database-backed DNS. If the provider cannot publish TLSA records in a signed zone, it cannot complete this DANE setup.\n\n### What goes in the wallet or registrar?\n\nOnly parent-side delegation material: nameserver, glue when needed, and DS. TLSA goes on the authoritative DNS server, not in the wallet or registrar.\n\n### Is SYNTH a website IP shortcut?\n\nNo. HNS `SYNTH4` and `SYNTH6` encode nameserver IPs for a synthetic `_..._synth.` nameserver. The authoritative DNS server still publishes website `A`/`AAAA`, `TLSA`, and signed DNSSEC records.\n\n### When do I paste DNSKEY?\n\nAfter the authoritative zone is signed. Paste the public DNSKEY into this app to generate the DS record for the parent.\n\n### Does the web server need a DANE plugin?\n\nNo. Nginx, Apache, and Caddy serve the normal certificate and private key. DANE-aware clients verify TLSA through DNSSEC.\n\n## Development\n\n```bash\nnpm install\nnpm run dev\nnpm test\nnpm run build\n```\n\nStatic output goes to `dist/`.\n\nDocker:\n\n```bash\ndocker build -t hns-dane-bootstrap-generator .\ndocker run --rm -p 8080:80 hns-dane-bootstrap-generator\n```\n\n## Core library\n\n```ts\nimport { generateBootstrap } from './core/bootstrap';\n\nconst result = await generateBootstrap({\n  domainType: 'hns',\n  setupMode: 'delegated',\n  domainInput: 'dane/',\n  nameserverHost: 'ns1.dane.',\n  nameserverIpv4: '203.0.113.10',\n  websiteIpv4: '203.0.113.20',\n  port: 443,\n  protocol: 'tcp',\n  pemInput: '-----BEGIN PUBLIC KEY-----...',\n  dnsServerPreset: 'generic-zone'\n});\n```\n\n## URL prefill\n\nThe UI accepts query parameters so HNScrawler or another report can hand off a specific next step:\n\n```text\n/dane-generator/?domain=example\u0026intent=generate_tlsa\n/dane-generator/?domain=example\u0026mode=synth\u0026ns4=203.0.113.10\u0026a=203.0.113.20\n```\n\nWhen `intent` is present, the UI shows a report handoff card that explains the next action, such as generating TLSA, fixing missing GLUE, checking DS/DNSKEY mismatch, replacing stale TLSA, or completing SYNTH DNS setup.\n\nAccepted aliases:\n\n- Domain: `domain`, `name`, `domainInput`, `domain_input`\n- Domain type: `domainType`, `domain_type`, `type` with `hns` or `icann`\n- Setup mode: `setupMode`, `setup_mode`, `mode` with `delegated` or `synth`/`hns-inline`\n- Next-step hint: `intent`, `action`, `next_step`\n- Nameserver: `nameserver`, `nameserverHost`, `ns`\n- Nameserver IPs: `ns4`, `ns6`, `glue4`, `glue6`\n- Website IPs: `a`, `aaaa`, `websiteIpv4`, `websiteIpv6`\n- Other fields: `port`, `preset`, `dnskey`, `pem`, `cert`, `certificate`\n\n## Design rules\n\n- **DRY**: one generator core feeds the UI, docs examples, tests, and integrator JSON.\n- **KISS**: no wallet broadcasting, registrar automation, DNS hosting panel, or live resolver dependency.\n- **SOLID**: domain normalization, DNSSEC, TLSA, server presets, and UI rendering are separate modules.\n\n## Standards anchors\n\n- DNSSEC: RFC 4034, RFC 4509.\n- DANE/TLSA: RFC 6698, RFC 7671.\n- DNSSEC algorithm guidance: IANA DNS Security Algorithm Numbers, IANA DS Digest Algorithms, RFC 9904, RFC 9905.\n- IDNA/i18n: RFC 5890-5894, RFC 3492, Unicode UTS #46.\n- Future email i18n scope: RFC 6530-6533.\n- Handshake resources: HNS `NS`, `DS`, `GLUE4`, `GLUE6`, `SYNTH4`, `SYNTH6`.\n\n## Donation\n\nDonation: [hs1q5997733eq7f4yyk2vq2z8gz3yqyvpz422ypggh](handshake:hs1q5997733eq7f4yyk2vq2z8gz3yqyvpz422ypggh)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdenuoweb%2Fhns-dane-bootstrap-generator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdenuoweb%2Fhns-dane-bootstrap-generator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdenuoweb%2Fhns-dane-bootstrap-generator/lists"}