2017-06-19 8 views
2

Ich habe vor kurzem versucht, Rubygem Grpc Version 1.3.2 als Clinet und Verbindung zu einem Grpc-Server, der aus Golang gebaut ist . Ich ging durch die Dokumentation unter GRPC.IO und benutzte es in meinem Code als es.Ruby Grpc (v1.3.2) Gem SSL/TLS Verbindungsproblem mit Grpc-Server komplett in Golang

irb(main):017:0> GRPC::Core::Credentials.new(File.read(CA_FILE_PATH)) 
NameError: uninitialized constant GRPC::Core::Credentials 
     from (irb):17 
     from /usr/local/share/gems/gems/railties-4.2.1/lib/rails/commands/console.rb:110:in `start' 
     from /usr/local/share/gems/gems/railties-4.2.1/lib/rails/commands/console.rb:9:in `start' 
     from /usr/local/share/gems/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:68:in `console' 
     from /usr/local/share/gems/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:39:in `run_command!' 
     from /usr/local/share/gems/gems/railties-4.2.1/lib/rails/commands.rb:17:in `<top (required)>' 
     from bin/rails:4:in `require' 
     from bin/rails:4:in `<main>' 

jedoch ihre Dokumentation ausdrücklich sagt,

creds = GRPC::Core::Credentials.new(load_certs) # load_certs typically loads a CA roots file 
stub = Helloworld::Greeter::Stub.new('myservice.example.com', creds) 

Dann kam ich auf ChannelCredentials und der creds sollte entweder ChannelCredentials Objekt oder ein Symbol (zB sein: this_channel_is_insecure). Daher habe ich es auch versucht.

Ich habe die folgende Funktion aus dem Quellcode des Grpc-Gem selbst genommen. Diese Funktion wurde in rspec Testfällen für das Laden des Zert genannt:

def load_certs 
     data_dir = "#{Rails.root}/certs" 
     files = ['ca.pem', 'server.key', 'server.pem'] 
     files.map { |f| File.open(File.join(data_dir, f)).read } 
end 

Dann gab ich ihm einen Versuch mit,

channel_creds = GRPC::Core::ChannelCredentials.new(load_certs) 
stub = Helloworld::Greeter::Stub.new('myservice.example.com', channel_creds) 

Aber die oben scheiterte mit

E0619 09:59:10.410575570 14208 ssl_transport_security.c:601] Could not load any root certificate. 
E0619 09:59:10.410604954 14208 ssl_transport_security.c:1315] Cannot load server root certificates. 
E0619 09:59:10.410622519 14208 security_connector.c:837] Handshaker factory creation failed with TSI_INVALID_ARGUMENT. 

ich auch versucht, :

channel_creds = GRPC::Core::ChannelCredentials.new(File.read(CA_FILE_PATH)) 
stub = Helloworld::Greeter::Stub.new('myservice.example.com', creds) 

B ut alles, was ich bekam, waren Fehler aus den Protokollen oder RPC-Server:

2017/06/16 10:52:34 transport: http2Server.HandleStreams failed to receive the preface from client: EOF 
2017/06/16 10:53:35 transport: http2Server.HandleStreams failed to receive the preface from client: EOF 
2017/06/16 10:53:59 transport: http2Server.HandleStreams failed to receive the preface from client: EOF 
2017/06/16 10:55:06 transport: http2Server.HandleStreams failed to receive the preface from client: EOF 

hat erfolgreich versucht jemand diese Golang Server-Kombination Ruby-Client mit SSL/TLS aktiviert?

Antwort

0

creds soll entweder ChannelCredentials sein Objekt oder ein Symbol

Ja das zweite Argument eines Client-Stub-Konstruktor (das creds Argument), sollte entweder ein GRPC::Core::ChannelCredentials Objekt oder spezifisch die ::this_channel_is_insecure Symbol (wenn letzteres übergeben wird, wird eine unsichere Verbindung verwendet).

Ich möchte anmerken, dass der Test, der

verwendet
def load_certs 
    data_dir = "#{Rails.root}/certs" 
    files = ['ca.pem', 'server.key', 'server.pem'] 
    files.map { |f| File.open(File.join(data_dir, f)).read } 
end 

könnte in der Tat irreführend sein, da es nur Sinn, Kanal-Anmeldeinformationen mit des Kunden zu bauen macht privaten Schlüssel und Zertifikatskette (das spezifische Test Ich glaube, verwendet nicht die Schlüssel- und Cert-Kette).

Auf dem GRPC::Core::ChannelCredentials Konstruktor:

Es gibt drei Formen, die verwendet werden können, (es gibt einen Kommentar über den Konstruktor Code in https://github.com/grpc/grpc/blob/master/src/ruby/ext/grpc/rb_channel_credentials.c#L128, der über sie geht), aber die Optionen sind:

  • Credentials.new()

  • Credentials.new(pem_root_certs)

  • Credentials.new(pem_root_certs, pem_private_key, pem_cert_chain)

In allen Fällen sind die Wurzeln Datei, private Schlüssel und cert Kette Parameter werden pem Strings codieren.

Hinweis: Wenn keine Argumente übergeben werden (Credentials.new() wird verwendet), werden die Server-Stammzertifikate wie in this header comment beschrieben gefunden (siehe Beschreibung für das Verhalten, wenn der Parameter server root certs null ist). Der letzte Konstruktor wird nur benötigt, wenn Sie möchten, dass der Client einen privaten Schlüssel und eine Zertifikatskette verwendet.

0

Ich kann bestätigen, dass dies funktioniert.

channel_creds = GRPC::Core::ChannelCredentials.new(File.read("/home/user/.lnd/tls.cert")) 
stub = Lnrpc::Lightning::Stub.new("127.0.0.1:10009", channel_creds) 
obj = Lnrpc::GetInfoRequest.new 
pp stub.get_info(obj)