Клиент Node js для сервера grpc

У меня есть сервер GRPC, работающий с использованием openssl — статический способ, и я пытаюсь подключиться к серверу с помощью клиента 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));

Чат.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();

person Nitin Lodhe    schedule 18.05.2017    source источник
comment
Можете ли вы включить код, который вы используете, чтобы сделать запрос? Вы видите какие-то конкретные ошибки? Кроме этого, вы не должны использовать закрытый ключ сервера и данные цепочки сертификатов на стороне клиента. Вам просто нужны корневые сертификаты, и если вы хотите выполнить аутентификацию клиента на основе TLS, у клиента должны быть свои собственные ckeys.   -  person murgatroid99    schedule 19.05.2017
comment
добавлены подробности в исходное сообщение, как было предложено - см. ниже разделы //Код для отправки запроса//Chat.proto Я пробовал использовать подход только с корневым сертификатом, и все равно такое же поведение. На данный момент у меня нет никаких требований для аутентификации клиента   -  person Nitin Lodhe    schedule 19.05.2017
comment
››Сценарий создания клиента 1: 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»   -  person Nitin Lodhe    schedule 19.05.2017
comment
Это похоже на ошибку. Вы уверены, что файл корневого сертификата имеет правильный формат?   -  person murgatroid99    schedule 19.05.2017
comment
да - я нахожусь в Windows - это файл .PEM, и если я просто переименую его в .CER, я смогу увидеть сертификат, и если я попытаюсь проверить opensl, *.PEM дает мне ответ OK   -  person Nitin Lodhe    schedule 20.05.2017
comment
Хорошо, для ясности, файл корневого сертификата — это список открытых ключей доверенных центров сертификации. Обычный случай предоставления собственного — это если у вас есть самозаверяющие сертификаты, и вы хотите доверять этому подписывающему лицу. Здесь такая ситуация?   -  person murgatroid99    schedule 20.05.2017
comment
Здесь root_cert, о котором я говорил, имел только файл корневого сертификата *.PEM. Я попытался добавить полную цепочку сертификатов - root_cert.PEM [имея ----- НАЧАТЬ СЕРТИФИКАТ ----- ‹ сертификат домена › ----- END CERTIFICATE----------BEGIN CERTIFICATE-----‹промежуточный сертификат› -----END CERTIFICATE----------BEGIN CERTIFICATE-----‹root cert › -----КОНЕЦ СЕРТИФИКАТА----- ] и видим тот же результат   -  person Nitin Lodhe    schedule 20.05.2017
comment
так что хорошая новость - ниже все сработало для меня var creds = grpc.credentials.createSsl(rootCert); var client = new chat_proto.ChatService('servervip:443',creds); Похоже, проблема с сертификатом - я использовал root.PEM по умолчанию в клиенте grpc, и у меня это сработало. будет внутренне искать правильный корень моей собственной цепочки сертификатов   -  person Nitin Lodhe    schedule 20.05.2017


Ответы (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));

Похоже, проблема с сертификатом - я использовал root.PEM по умолчанию в клиенте grpc, и у меня это сработало. будет внутренне искать правильный корень моей цепочки сертификатов CA servervip.

Спасибо всем за вашу поддержку

person Nitin Lodhe    schedule 20.05.2017