GRPC Golang 服务器和 NodeJS 客户端。 TLS 连接失败
GRPC Golang Server and NodeJS client. TLS connect failed
不使用 TLS 时一切正常。但是当我这样做时,它没有连接。更多详情:
我已经配置了 Golang GRPC 服务器,就像这个博客在 Mutual TLS with Certificate Authority 部分所说的 https://bbengfort.github.io/programmer/2017/03/03/secure-grpc.html 一样。服务器已启动,运行ning 正常。
现在我有一个用 NodeJS 编写的客户端,试图通过 grpc 发送一些数据。我已经像下面这样配置了 NodeJS:
var PROTO_PATH = __dirname + '/protos/log.proto';
var grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
});
var ssl_creds = grpc.credentials.createSsl(fs.readFileSync('ssl/ca.crt'), fs.readFileSync('ssl/client.key'), fs.readFileSync('ssl/client.crt'));
var log_proto = grpc.loadPackageDefinition(packageDefinition).log;
var client = new log_proto.LogData('<IP>:<PORT>',ssl_creds);
我创建了证书,就像这里提到的那样:https://github.com/grpc/grpc/issues/6757. Ofcourse, i did see this comment: https://github.com/grpc/grpc/issues/6757#issuecomment-264617793。
我在 运行 NodeJS 客户端时仍然看到错误:
{ Error: 14 UNAVAILABLE: Connect Failed
at Object.exports.createStatusError (/app/node_modules/grpc/src/common.js:91:15)
at Object.onReceiveStatus (/app/node_modules/grpc/src/client_interceptors.js:1204:28)
at InterceptingListener._callNext (/app/node_modules/grpc/src/client_interceptors.js:568:42)
at InterceptingListener.onReceiveStatus (/app/node_modules/grpc/src/client_interceptors.js:618:8)
at callback (/app/node_modules/grpc/src/client_interceptors.js:845:24)
code: 14,
metadata: Metadata { _internal_repr: {} },
details: 'Connect Failed' }
证书详情:
SSLv3
TLSv1.2
编辑:
我将环境变量 GRPC_VERBOSITY 添加为 DEBUG 并发现以下内容:Peer name <IP> is not in peer certificate
所以问题是证书不能将 IP 地址作为主机名。它应该有一个名称而不是 IP - 通过提供名称并覆盖目标名称来修复它。
const options = {
'grpc.ssl_target_name_override' : 'simple-host',
'grpc.default_authority': 'simple-host'
};
var client = new log_proto.LogData('<IP>:<PORT>',ssl_creds,options);
不使用 TLS 时一切正常。但是当我这样做时,它没有连接。更多详情:
我已经配置了 Golang GRPC 服务器,就像这个博客在 Mutual TLS with Certificate Authority 部分所说的 https://bbengfort.github.io/programmer/2017/03/03/secure-grpc.html 一样。服务器已启动,运行ning 正常。
现在我有一个用 NodeJS 编写的客户端,试图通过 grpc 发送一些数据。我已经像下面这样配置了 NodeJS:
var PROTO_PATH = __dirname + '/protos/log.proto';
var grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
});
var ssl_creds = grpc.credentials.createSsl(fs.readFileSync('ssl/ca.crt'), fs.readFileSync('ssl/client.key'), fs.readFileSync('ssl/client.crt'));
var log_proto = grpc.loadPackageDefinition(packageDefinition).log;
var client = new log_proto.LogData('<IP>:<PORT>',ssl_creds);
我创建了证书,就像这里提到的那样:https://github.com/grpc/grpc/issues/6757. Ofcourse, i did see this comment: https://github.com/grpc/grpc/issues/6757#issuecomment-264617793。
我在 运行 NodeJS 客户端时仍然看到错误:
{ Error: 14 UNAVAILABLE: Connect Failed
at Object.exports.createStatusError (/app/node_modules/grpc/src/common.js:91:15)
at Object.onReceiveStatus (/app/node_modules/grpc/src/client_interceptors.js:1204:28)
at InterceptingListener._callNext (/app/node_modules/grpc/src/client_interceptors.js:568:42)
at InterceptingListener.onReceiveStatus (/app/node_modules/grpc/src/client_interceptors.js:618:8)
at callback (/app/node_modules/grpc/src/client_interceptors.js:845:24)
code: 14,
metadata: Metadata { _internal_repr: {} },
details: 'Connect Failed' }
证书详情: SSLv3 TLSv1.2
编辑:
我将环境变量 GRPC_VERBOSITY 添加为 DEBUG 并发现以下内容:Peer name <IP> is not in peer certificate
所以问题是证书不能将 IP 地址作为主机名。它应该有一个名称而不是 IP - 通过提供名称并覆盖目标名称来修复它。
const options = {
'grpc.ssl_target_name_override' : 'simple-host',
'grpc.default_authority': 'simple-host'
};
var client = new log_proto.LogData('<IP>:<PORT>',ssl_creds,options);