grpc-js: secure channel to an IP address fails on Node 25+ (servername set to IP literal)

Aperta Adatta ai principianti
#3,127 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
75/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
grpc, node.js, typescript

Direzione di ricerca

Inizia in channel-credentials.ts, in corrispondenza di getConnectionOptions, poi verifica come SecureConnectorImpl.connect gestisce gli errori di tls.connect. La riproduzione nell’issue mostra il fallimento con una destinazione IP e il successo con un nome host; conferma il comportamento con quella riproduzione su Node 26. Il lavoro è completato quando le destinazioni IP si connettono senza passare un IP letterale come servername, mentre i nomi host continuano a connettersi.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Problem description

Credentials from createSsl() cannot connect to a target given by IP address on Node 25 and later.

getConnectionOptions in channel-credentials.ts sets servername = remoteHost unconditionally (since #1466). Node 25 made DEP0123 End-of-Life (nodejs/node#58533), so tls.connect now throws instead of warning when servername is an IP literal:

ERR_INVALID_ARG_VALUE: The property 'options.servername' Setting the TLS ServerName to an IP address is not permitted.. Received '127.0.0.1'

The throw happens inside the connect promise in SecureConnectorImpl.connect, so the caller only ever sees 14 UNAVAILABLE: No connection established. Hostname targets work. Node 26 is the current LTS, so this now hits default installs.

Reproduction steps

Any TLS gRPC server listening on 127.0.0.1:PORT, then:

const grpc = require('@grpc/grpc-js');
const client = new grpc.Client('127.0.0.1:PORT',
  grpc.credentials.createSsl(null, null, null, { rejectUnauthorized: false }));
client.waitForReady(Date.now() + 2000, err => console.log(err ? err.message : 'connected'));

Node 24: connected
Node 26: Failed to connect before the deadline

Wrapping tls.connect to log its options shows servername: '127.0.0.1' on every attempt, and the synchronous ERR_INVALID_ARG_VALUE throw.

Environment
  • Linux 7.0, amd64
  • Node v26.13.0 (works on v24.17.0)
  • fnm
  • @grpc/grpc-js 1.14.7, same code on master
Additional context

Node's own https agent already skips SNI for IP literals. Same one-line change here:

if (!net.isIP(remoteHost)) {
  connectionOptions.servername = remoteHost;
}
Lingua principale
TypeScript
Stelle
4.8k
Fork
720
Merge medio
2g 11h
PR unite (30g)
7

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di grpc/grpc-node

Tutte le issue di grpc/grpc-node

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.