GRPC Golang服务器和NodeJS客户端。 TLS连接失败

时间:2019-02-27 02:15:20

标签: node.js go grpc grpc-node

当我不使用TLS时,一切正常。但是当我这样做时,它不会连接。详细信息:

我已按照此博客在“具有证书颁发机构的相互TLS”部分中所说的https://bbengfort.github.io/programmer/2017/03/03/secure-grpc.html的方式完全配置了Golang GRPC服务器。服务器启动并运行正常。

现在我有一个用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。当然,我确实看到了以下评论: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

1 个答案:

答案 0 :(得分:0)

所以问题是证书无法将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);