Skip to content

Commit c3c7cc4

Browse files
authored
Merge pull request #2704 from murgatroid99/grpc-js_check_server_identity
grpc-js: Call custom `checkServerIdentity` when target name override is set
2 parents cc44d78 + e1f831a commit c3c7cc4

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

packages/grpc-js/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@grpc/grpc-js",
3-
"version": "1.10.4",
3+
"version": "1.10.5",
44
"description": "gRPC Library for Node - pure JS implementation",
55
"homepage": "https://grpc.io/",
66
"repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js",

packages/grpc-js/src/transport.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -694,11 +694,13 @@ export class Http2SubchannelConnector implements SubchannelConnector {
694694
if (options['grpc.ssl_target_name_override']) {
695695
const sslTargetNameOverride =
696696
options['grpc.ssl_target_name_override']!;
697+
const originalCheckServerIdentity =
698+
connectionOptions.checkServerIdentity ?? checkServerIdentity;
697699
connectionOptions.checkServerIdentity = (
698700
host: string,
699701
cert: PeerCertificate
700702
): Error | undefined => {
701-
return checkServerIdentity(sslTargetNameOverride, cert);
703+
return originalCheckServerIdentity(sslTargetNameOverride, cert);
702704
};
703705
connectionOptions.servername = sslTargetNameOverride;
704706
} else {
@@ -804,11 +806,13 @@ export class Http2SubchannelConnector implements SubchannelConnector {
804806
// This option is used for testing only.
805807
if (options['grpc.ssl_target_name_override']) {
806808
const sslTargetNameOverride = options['grpc.ssl_target_name_override']!;
809+
const originalCheckServerIdentity =
810+
connectionOptions.checkServerIdentity ?? checkServerIdentity;
807811
connectionOptions.checkServerIdentity = (
808812
host: string,
809813
cert: PeerCertificate
810814
): Error | undefined => {
811-
return checkServerIdentity(sslTargetNameOverride, cert);
815+
return originalCheckServerIdentity(sslTargetNameOverride, cert);
812816
};
813817
connectionOptions.servername = sslTargetNameOverride;
814818
} else {

packages/grpc-js/test/test-channel-credentials.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,12 @@ describe('ChannelCredentials Implementation', () => {
150150
describe('ChannelCredentials usage', () => {
151151
let client: ServiceClient;
152152
let server: grpc.Server;
153+
let portNum: number;
154+
let caCert: Buffer;
155+
const hostnameOverride = 'foo.test.google.fr';
153156
before(async () => {
154157
const { ca, key, cert } = await pFixtures;
158+
caCert = ca;
155159
const serverCreds = grpc.ServerCredentials.createSsl(null, [
156160
{ private_key: key, cert_chain: cert },
157161
]);
@@ -178,9 +182,10 @@ describe('ChannelCredentials usage', () => {
178182
reject(err);
179183
return;
180184
}
185+
portNum = port;
181186
client = new echoService(`localhost:${port}`, combinedCreds, {
182-
'grpc.ssl_target_name_override': 'foo.test.google.fr',
183-
'grpc.default_authority': 'foo.test.google.fr',
187+
'grpc.ssl_target_name_override': hostnameOverride,
188+
'grpc.default_authority': hostnameOverride,
184189
});
185190
server.start();
186191
resolve();
@@ -207,4 +212,25 @@ describe('ChannelCredentials usage', () => {
207212
);
208213
assert2.afterMustCallsSatisfied(done);
209214
});
215+
216+
it('Should call the checkServerIdentity callback', done => {
217+
const channelCreds = ChannelCredentials.createSsl(caCert, null, null, {
218+
checkServerIdentity: assert2.mustCall((hostname, cert) => {
219+
assert.strictEqual(hostname, hostnameOverride);
220+
return undefined;
221+
}),
222+
});
223+
const client = new echoService(`localhost:${portNum}`, channelCreds, {
224+
'grpc.ssl_target_name_override': hostnameOverride,
225+
'grpc.default_authority': hostnameOverride,
226+
});
227+
client.echo(
228+
{ value: 'test value', value2: 3 },
229+
assert2.mustCall((error: ServiceError, response: any) => {
230+
assert.ifError(error);
231+
assert.deepStrictEqual(response, { value: 'test value', value2: 3 });
232+
})
233+
);
234+
assert2.afterMustCallsSatisfied(done);
235+
});
210236
});

0 commit comments

Comments
 (0)