【问题标题】:Node js client for grpc servergrpc服务器的Node js客户端
【发布时间】:2017-05-18 22:41:10
【问题描述】:

我有使用 openssl - 静态方式运行的 GRPC 服务器,我正在尝试使用 nodejs 客户端连接到服务器

我没有看到任何错误,但我也没有看到它连接到服务器。 如果您有任何样品,请分享。

请参考以下代码:

    var rootCertPath = path.join('.','.', 'server-root.PEM');
    var privateCertPath = path.join('.','.', 'server-private.PEM');
    var domainCertPath = path.join('.','.', 'server-domain.PEM');

    var rootCert = fs.readFileSync(rootCertPath);
    var privateCert = fs.readFileSync(privateCertPath);
    var domainCert = fs.readFileSync(domainCertPath);

    var buf1 = new Buffer('rootCert');
    var buf2 = new Buffer('privateCert');
    var buf3 = new Buffer('domainCert');

    var chat_proto = grpc.load("Chat.proto").com.company.grpc;
    var client = new chat_proto.ChatService('https://servervip:443',grpc.credentials.createSsl(buf1,buf2,buf3));

Chat.proto

  syntax = "proto3";

        // Service definition.

            service ChatService {
              // Sends a chat
               rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer) {}
            }
        // The request message containing the user's name.
        message ChatMessage {
          string name = 1;
          string message = 2;
        }

        // The response message containing the greetings
        message ChatMessageFromServer {
            string name = 1;
            string message = 2;
        }

//发出请求的代码

var username = process.argv[2];
var stdin = process.openStdin();

function main() {
    console.log("starting");
    console.log(client); // prints { '$channel': Channel {} }
    var chat=client.chat();
    chat.on('data', function(msg) {
      console.log(msg.name + ': ' + msg.message);
        console.log("after message");
    });

    stdin.addListener('data',function(input) {
        chat.write({ name: username, message: input.toString().trim()
        }); 

    });

}
main();

【问题讨论】:

  • 您能否包含用于实际发出请求的代码?您是否看到任何具体错误?除此之外,您不应该在客户端使用服务器的私钥和证书链数据。你只需要root证书,如果你想做基于TLS的客户端认证,客户端应该有自己的ckeys。
  • 按照建议在原始帖子中添加了详细信息 - 请参阅以下部分 // 发出请求的代码 //Chat.proto 我尝试使用仅根证书的方法,但行为仍然相同 我没有任何要求现在验证客户端
  • >> 创建客户端场景一:var client = new chat_proto.ChatService('servervip:443',creds);没有错误但没有响应>>错误创建客户端场景2:var client = new chat_proto.ChatService('servervip',creds); E0519 11312 ssl_transport_security.c:601] 无法加载任何根证书。 E0519 11312 ssl_transport_security.c:1315] 无法加载服务器根证书。 E0519 11312 security_connector.c:837] 握手器工厂创建失败,出现 TSI_INVALID_ARGUMENT。 E0519 11312 secure_channel_create.c:127] 无法为安全名称“servervip”创建安全子通道
  • 这看起来像是一个错误。您确定您的根证书文件格式正确吗?
  • 是的 - 我在 Windows 上 - 它是 .PEM 文件,如果我只是将其重命名为 .CER,我可以看到证书,如果我尝试使用 opensl 验证 *.PEM 会给我回复 OK

标签: node.js client chat grpc


【解决方案1】:

这么好的新东西 - 下面的东西对我有用

var rootCertPath = path.join('.','.', 'roots.PEM');
var rootCert = fs.readFileSync(rootCertPath);
var chat_proto = grpc.load("Chat.proto").com.americanexpress.grpc.chat;
var client = new chat_proto.ChatService('servervip:443',grpc.credentials.createSsl(rootCert));

看起来证书有问题 - 我在 grpc 客户端中使用了默认的 root.PEM,它对我有用。将在内部查看我的 servervip CA 证书链的正确根。

感谢大家的支持

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 2020-09-09
    • 2020-11-20
    • 2021-10-29
    • 2018-04-12
    • 2021-04-10
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多