René's URL Explorer Experiment


Title: tls: checkServerIdentity() no longer matches IPv6 IP-Address SANs (regressed in v24.17.0) · Issue #64144 · nodejs/node · GitHub

Open Graph Title: tls: checkServerIdentity() no longer matches IPv6 IP-Address SANs (regressed in v24.17.0) · Issue #64144 · nodejs/node

X Title: tls: checkServerIdentity() no longer matches IPv6 IP-Address SANs (regressed in v24.17.0) · Issue #64144 · nodejs/node

Description: Version v24.17.0, v24.18.0, v22.23.1, v26.4.0 (and the other CVE-2026-48618 security releases). Last good: v24.16.0. Platform All (logic-only; reproduced on Linux x86-64). Subsystem tls What steps will reproduce the bug? tls.checkServerI...

Open Graph Description: Version v24.17.0, v24.18.0, v22.23.1, v26.4.0 (and the other CVE-2026-48618 security releases). Last good: v24.16.0. Platform All (logic-only; reproduced on Linux x86-64). Subsystem tls What steps ...

X Description: Version v24.17.0, v24.18.0, v22.23.1, v26.4.0 (and the other CVE-2026-48618 security releases). Last good: v24.16.0. Platform All (logic-only; reproduced on Linux x86-64). Subsystem tls What steps ...

Opengraph URL: https://github.com/nodejs/node/issues/64144

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"tls: checkServerIdentity() no longer matches IPv6 IP-Address SANs (regressed in v24.17.0)","articleBody":"### Version\n\nv24.17.0, v24.18.0, v22.23.1, v26.4.0 (and the other CVE-2026-48618 security releases). **Last good: v24.16.0.**\n\n### Platform\n\nAll (logic-only; reproduced on Linux x86-64).\n\n### Subsystem\n\ntls\n\n### What steps will reproduce the bug?\n\n`tls.checkServerIdentity()` no longer matches an IPv6 host against a matching `IP Address` SAN. It returns `ERR_TLS_CERT_ALTNAME_INVALID` (`Cert does not contain a DNS name`) where it used to return `undefined`.\n\n```js\nconst tls = require('node:tls');\n\nconst result = tls.checkServerIdentity('::1', {\n  subject: {},\n  subjectaltname: 'IP Address:::1',\n});\n\nconsole.log(result === undefined ? 'OK (matched)' : `BROKEN: ${result.reason}`);\n```\n\nAcross versions:\n\n```\nv24.16.0  -\u003e OK (matched)        // last good\nv24.17.0  -\u003e BROKEN: Cert does not contain a DNS name   // first broken (24.x)\nv24.18.0  -\u003e BROKEN\nv22.23.1  -\u003e BROKEN\nv26.4.0   -\u003e BROKEN\n```\n\n### How often does it reproduce? Is there a required configuration?\n\n100% on the affected versions. No configuration required.\n\n### What is the expected behavior? Why is that the expected behavior?\n\n`undefined` (a successful match): the host `::1` is an IPv6 literal and the certificate carries that exact IP in an `IP Address` SAN, so server-identity verification should pass — as it did through v24.16.0. IPv4 (`IP Address:1.2.3.4` for host `1.2.3.4`) still works, so the IP-SAN matching path is expected to work for IPv6 too.\n\n### What do you see instead?\n\n`ERR_TLS_CERT_ALTNAME_INVALID` with reason `Cert does not contain a DNS name` — i.e. the IP-SAN matching branch is skipped entirely and it falls through to the no-identifier fallback.\n\n### Additional information\n\n**Root cause.** This regressed in **CVE-2026-48618** — commit [`1efb4ff51a0`](https://github.com/nodejs/node/commit/1efb4ff51a0624236332ea98b23bd1106f68d8af) *“tls: normalize hostname for server identity checks”*. That change moved the IP gate from the original hostname to the IDNA-normalized one:\n\n```diff\n-  hostname = unfqdn(hostname);\n-  if (net.isIP(hostname)) {\n-    valid = ips.includes(canonicalizeIP(hostname));\n+  if (net.isIP(hostnameASCIIWithoutFQDN)) {\n+    valid = ips.includes(canonicalizeIP(hostnameASCIIWithoutFQDN));\n```\n\nwhere `hostnameASCII = domainToASCII(hostname)` (`lib/tls.js`). But `domainToASCII('::1') === ''` — an IPv6 literal is not a valid domain — so `net.isIP('')` is `0`, the IP branch is skipped, and (with no DNS SAN and no CN) it returns `Cert does not contain a DNS name`. IPv4 is unaffected because dotted-decimal survives `domainToASCII` (`domainToASCII('1.2.3.4') === '1.2.3.4'`).\n\n```js\nconst { domainToASCII } = require('node:url');\nconst net = require('node:net');\ndomainToASCII('::1');                 // ''  -\u003e net.isIP('')        === 0  (IPv6 IP-SAN matching skipped)\ndomainToASCII('1.2.3.4');             // '1.2.3.4' -\u003e net.isIP(...) === 4  (IPv4 still works)\n```\n\n**Impact.** A TLS client connecting to an IPv6 literal whose certificate carries that address in an `IP Address` SAN now fails server-identity verification. This is fail-closed (no security hole), but it breaks a legitimate IPv6 TLS use case, and `tls.checkServerIdentity()` is public, documented API.\n\n**Suggested fix.** IDNA normalization should not apply to IP literals. Gate the IP branch on the *original* hostname so IPv6 (and IPv4) literals bypass `domainToASCII`, while keeping the normalization for the DNS-name branch (which is what the CVE fix is actually about):\n\n```js\nif (net.isIP(hostname)) {\n  valid = ips.includes(canonicalizeIP(hostname));\n  // ...\n} else if (dnsNames.length \u003e 0 || subject?.CN) {\n  const hostParts = splitHost(hostnameASCIIWithoutFQDN);   // DNS path keeps the normalization\n  // ...\n}\n```\n\n`canonicalizeIP()` already canonicalizes IP literals, and an IP literal cannot be a Unicode/IDNA confusable, so this preserves the CVE-2026-48618 hardening for DNS names while restoring IPv6 IP-SAN matching.\n\nRefs: CVE-2026-48618, [`1efb4ff51a0`](https://github.com/nodejs/node/commit/1efb4ff51a0624236332ea98b23bd1106f68d8af).\n","author":{"url":"https://github.com/JumpLink","@type":"Person","name":"JumpLink"},"datePublished":"2026-06-26T09:58:32.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/64144/node/issues/64144"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:ddf2603a-d04c-5a4e-0913-852f48653f12
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idCE52:119F46:667FDE:9166CF:6A631259
html-safe-nonce4f6ac7a7b97afb1cc7aa8a0f23f6235467503355a6425cc08531af21bc52e511
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDRTUyOjExOUY0Njo2NjdGREU6OTE2NkNGOjZBNjMxMjU5IiwidmlzaXRvcl9pZCI6IjMxMDk2NzgyMDIzNzU4MzYyNDkiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmacd7ee31062d29a55b6fbe50035d3e8bae6af53fc4af4d999e1f5450c0fabe257c
hovercard-subject-tagissue:4751078716
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/nodejs/node/64144/issue_layout
twitter:imagehttps://opengraph.githubassets.com/f07b3469f652cc3bc7eaecb4bac5a1fae0ef0ceb4b14906d3a41870b887426a7/nodejs/node/issues/64144
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/f07b3469f652cc3bc7eaecb4bac5a1fae0ef0ceb4b14906d3a41870b887426a7/nodejs/node/issues/64144
og:image:altVersion v24.17.0, v24.18.0, v22.23.1, v26.4.0 (and the other CVE-2026-48618 security releases). Last good: v24.16.0. Platform All (logic-only; reproduced on Linux x86-64). Subsystem tls What steps ...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernameJumpLink
hostnamegithub.com
expected-hostnamegithub.com
None1a6c056e02f174fffc096c521ec0ff6fb83e40a2ec8cb8875466ec1524872dd6
turbo-cache-controlno-preview
go-importgithub.com/nodejs/node git https://github.com/nodejs/node.git
octolytics-dimension-user_id9950313
octolytics-dimension-user_loginnodejs
octolytics-dimension-repository_id27193779
octolytics-dimension-repository_nwonodejs/node
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id27193779
octolytics-dimension-repository_network_root_nwonodejs/node
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release6a93e25585f487ddff9e3996c06d5b869d6e1828
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/nodejs/node/issues/64144#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fissues%2F64144
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
Code QualityEnforce quality at mergehttps://github.com/features/code-quality
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fissues%2F64144
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=nodejs%2Fnode
Reloadhttps://github.com/nodejs/node/issues/64144
Reloadhttps://github.com/nodejs/node/issues/64144
Reloadhttps://github.com/nodejs/node/issues/64144
Please reload this pagehttps://github.com/nodejs/node/issues/64144
nodejs https://github.com/nodejs
nodehttps://github.com/nodejs/node
Please reload this pagehttps://github.com/nodejs/node/issues/64144
Notifications https://github.com/login?return_to=%2Fnodejs%2Fnode
Fork 36.1k https://github.com/login?return_to=%2Fnodejs%2Fnode
Star 118k https://github.com/login?return_to=%2Fnodejs%2Fnode
Code https://github.com/nodejs/node
Issues 1.3k https://github.com/nodejs/node/issues
Pull requests 1k https://github.com/nodejs/node/pulls
Actions https://github.com/nodejs/node/actions
Projects https://github.com/nodejs/node/projects
Security and quality 0 https://github.com/nodejs/node/security
Insights https://github.com/nodejs/node/pulse
Code https://github.com/nodejs/node
Issues https://github.com/nodejs/node/issues
Pull requests https://github.com/nodejs/node/pulls
Actions https://github.com/nodejs/node/actions
Projects https://github.com/nodejs/node/projects
Security and quality https://github.com/nodejs/node/security
Insights https://github.com/nodejs/node/pulse
#64145https://github.com/nodejs/node/pull/64145
tls: checkServerIdentity() no longer matches IPv6 IP-Address SANs (regressed in v24.17.0)https://github.com/nodejs/node/issues/64144#top
#64145https://github.com/nodejs/node/pull/64145
https://github.com/JumpLink
JumpLinkhttps://github.com/JumpLink
on Jun 26, 2026https://github.com/nodejs/node/issues/64144#issue-4751078716
CVE-2026-48618https://github.com/advisories/GHSA-g57m-hr98-5m89
CVE-2026-48618https://github.com/advisories/GHSA-g57m-hr98-5m89
1efb4ff51a0https://github.com/nodejs/node/commit/1efb4ff51a0624236332ea98b23bd1106f68d8af
CVE-2026-48618https://github.com/advisories/GHSA-g57m-hr98-5m89
CVE-2026-48618https://github.com/advisories/GHSA-g57m-hr98-5m89
1efb4ff51a0https://github.com/nodejs/node/commit/1efb4ff51a0624236332ea98b23bd1106f68d8af
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.