mirror of https://github.com/grpc/grpc.git
parent
7cc30c1155
commit
7cc83e0701
4 changed files with 171 additions and 4 deletions
@ -0,0 +1,137 @@ |
|||||||
|
# Copyright 2015 gRPC authors. |
||||||
|
# |
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
# you may not use this file except in compliance with the License. |
||||||
|
# You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, software |
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
# See the License for the specific language governing permissions and |
||||||
|
# limitations under the License. |
||||||
|
|
||||||
|
require 'grpc' |
||||||
|
|
||||||
|
def create_channel_creds |
||||||
|
test_root = File.join(File.dirname(__FILE__), 'testdata') |
||||||
|
files = ['ca.pem', 'client.key', 'client.pem'] |
||||||
|
creds = files.map { |f| File.open(File.join(test_root, f)).read } |
||||||
|
GRPC::Core::ChannelCredentials.new(creds[0], creds[1], creds[2]) |
||||||
|
end |
||||||
|
|
||||||
|
def client_cert |
||||||
|
test_root = File.join(File.dirname(__FILE__), 'testdata') |
||||||
|
cert = File.open(File.join(test_root, 'client.pem')).read |
||||||
|
fail unless cert.is_a?(String) |
||||||
|
cert |
||||||
|
end |
||||||
|
|
||||||
|
def create_server_creds |
||||||
|
test_root = File.join(File.dirname(__FILE__), 'testdata') |
||||||
|
p "test root: #{test_root}" |
||||||
|
files = ['ca.pem', 'server1.key', 'server1.pem'] |
||||||
|
creds = files.map { |f| File.open(File.join(test_root, f)).read } |
||||||
|
GRPC::Core::ServerCredentials.new( |
||||||
|
creds[0], |
||||||
|
[{ private_key: creds[1], cert_chain: creds[2] }], |
||||||
|
true) # force client auth |
||||||
|
end |
||||||
|
|
||||||
|
# A test message |
||||||
|
class EchoMsg |
||||||
|
def self.marshal(_o) |
||||||
|
'' |
||||||
|
end |
||||||
|
|
||||||
|
def self.unmarshal(_o) |
||||||
|
EchoMsg.new |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
# a test service that checks the cert of its peer |
||||||
|
class SslTestService |
||||||
|
include GRPC::GenericService |
||||||
|
rpc :an_rpc, EchoMsg, EchoMsg |
||||||
|
rpc :a_client_streaming_rpc, stream(EchoMsg), EchoMsg |
||||||
|
rpc :a_server_streaming_rpc, EchoMsg, stream(EchoMsg) |
||||||
|
rpc :a_bidi_rpc, stream(EchoMsg), stream(EchoMsg) |
||||||
|
|
||||||
|
def check_peer_cert(call) |
||||||
|
error_msg = "want:\n#{client_cert}\n\ngot:\n#{call.peer_cert}" |
||||||
|
fail(error_msg) unless call.peer_cert == client_cert |
||||||
|
end |
||||||
|
|
||||||
|
def an_rpc(req, call) |
||||||
|
check_peer_cert(call) |
||||||
|
req |
||||||
|
end |
||||||
|
|
||||||
|
def a_client_streaming_rpc(call) |
||||||
|
check_peer_cert(call) |
||||||
|
call.each_remote_read.each { |r| p r } |
||||||
|
EchoMsg.new |
||||||
|
end |
||||||
|
|
||||||
|
def a_server_streaming_rpc(_, call) |
||||||
|
check_peer_cert(call) |
||||||
|
[EchoMsg.new, EchoMsg.new] |
||||||
|
end |
||||||
|
|
||||||
|
def a_bidi_rpc(requests, call) |
||||||
|
check_peer_cert(call) |
||||||
|
requests.each { |r| p r } |
||||||
|
[EchoMsg.new, EchoMsg.new] |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
SslTestServiceStub = SslTestService.rpc_stub_class |
||||||
|
|
||||||
|
describe 'client-server auth' do |
||||||
|
RpcServer = GRPC::RpcServer |
||||||
|
|
||||||
|
before(:all) do |
||||||
|
server_opts = { |
||||||
|
poll_period: 1 |
||||||
|
} |
||||||
|
@srv = RpcServer.new(**server_opts) |
||||||
|
port = @srv.add_http2_port('0.0.0.0:0', create_server_creds) |
||||||
|
@srv.handle(SslTestService) |
||||||
|
@srv_thd = Thread.new { @srv.run } |
||||||
|
@srv.wait_till_running |
||||||
|
|
||||||
|
client_opts = { |
||||||
|
channel_args: { |
||||||
|
GRPC::Core::Channel::SSL_TARGET => 'foo.test.google.fr' |
||||||
|
} |
||||||
|
} |
||||||
|
@stub = SslTestServiceStub.new("localhost:#{port}", |
||||||
|
create_channel_creds, |
||||||
|
**client_opts) |
||||||
|
end |
||||||
|
|
||||||
|
after(:all) do |
||||||
|
expect(@srv.stopped?).to be(false) |
||||||
|
@srv.stop |
||||||
|
@srv_thd.join |
||||||
|
end |
||||||
|
|
||||||
|
it 'client-server auth with unary RPCs' do |
||||||
|
@stub.an_rpc(EchoMsg.new) |
||||||
|
end |
||||||
|
|
||||||
|
it 'client-server auth with client streaming RPCs' do |
||||||
|
@stub.a_client_streaming_rpc([EchoMsg.new, EchoMsg.new]) |
||||||
|
end |
||||||
|
|
||||||
|
it 'client-server auth with server streaming RPCs' do |
||||||
|
responses = @stub.a_server_streaming_rpc(EchoMsg.new) |
||||||
|
responses.each { |r| p r } |
||||||
|
end |
||||||
|
|
||||||
|
it 'client-server auth with bidi RPCs' do |
||||||
|
responses = @stub.a_bidi_rpc([EchoMsg.new, EchoMsg.new]) |
||||||
|
responses.each { |r| p r } |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,16 @@ |
|||||||
|
-----BEGIN PRIVATE KEY----- |
||||||
|
MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAOxUR9uhvhbeVUIM |
||||||
|
s5WbH0px0mehl2+6sZpNjzvE2KimZpHzMJHukVH0Ffkvhs0b8+S5Ut9VNUAqd3IM |
||||||
|
JCCAEGtRNoQhM1t9Yr2zAckSvbRacp+FL/Cj9eDmyo00KsVGaeefA4Dh4OW+ZhkT |
||||||
|
NKcldXqkSuj1sEf244JZYuqZp6/tAgMBAAECgYEAi2NSVqpZMafE5YYUTcMGe6QS |
||||||
|
k2jtpsqYgggI2RnLJ/2tNZwYI5pwP8QVSbnMaiF4gokD5hGdrNDfTnb2v+yIwYEH |
||||||
|
0w8+oG7Z81KodsiZSIDJfTGsAZhVNwOz9y0VD8BBZZ1/274Zh52AUKLjZS/ZwIbS |
||||||
|
W2ywya855dPnH/wj+0ECQQD9X8D920kByTNHhBG18biAEZ4pxs9f0OAG8333eVcI |
||||||
|
w2lJDLsYDZrCB2ocgA3lUdozlzPC7YDYw8reg0tkiRY5AkEA7sdNzOeQsQRn7++5 |
||||||
|
0bP9DtT/iON1gbfxRzCfCfXdoOtfQWIzTePWtURt9X/5D9NofI0Rg5W2oGy/MLe5 |
||||||
|
/sXHVQJBAIup5XrJDkQywNZyAUU2ecn2bCWBFjwtqd+LBmuMciI9fOKsZtEKZrz/ |
||||||
|
U0lkeMRoSwvXE8wmGLjjrAbdfohrXFkCQQDZEx/LtIl6JINJQiswVe0tWr6k+ASP |
||||||
|
1WXoTm+HYpoF/XUvv9LccNF1IazFj34hwRQwhx7w/V52Ieb+p0jUMYGxAkEAjDhd |
||||||
|
9pBO1fKXWiXzi9ZKfoyTNcUq3eBSVKwPG2nItg5ycXengjT5sgcWDnciIzW7BIVI |
||||||
|
JiqOszq9GWESErAatg== |
||||||
|
-----END PRIVATE KEY----- |
@ -0,0 +1,14 @@ |
|||||||
|
-----BEGIN CERTIFICATE----- |
||||||
|
MIICHzCCAYgCAQEwDQYJKoZIhvcNAQEFBQAwVjELMAkGA1UEBhMCQVUxEzARBgNV |
||||||
|
BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 |
||||||
|
ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTE0MDcxNzIzNTYwMloXDTI0MDcxNDIzNTYw |
||||||
|
MlowWjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM |
||||||
|
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDETMBEGA1UEAwwKdGVzdGNsaWVudDCB |
||||||
|
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA7FRH26G+Ft5VQgyzlZsfSnHSZ6GX |
||||||
|
b7qxmk2PO8TYqKZmkfMwke6RUfQV+S+GzRvz5LlS31U1QCp3cgwkIIAQa1E2hCEz |
||||||
|
W31ivbMByRK9tFpyn4Uv8KP14ObKjTQqxUZp558DgOHg5b5mGRM0pyV1eqRK6PWw |
||||||
|
R/bjglli6pmnr+0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAStSm5PM7ubROiKK6/ |
||||||
|
T2FkKlhiTOx+Ryenm3Eio59emq+jXl+1nhPySX5G2PQzSR5vd1dIhwgZSR4Gyttk |
||||||
|
tRZ57k/NI1brUW8joiEOMJA/Mr7H7asx7wIRYDE91Fs8GkKWd5LhoPAQj+qdG35C |
||||||
|
OO+svdkmqH0KZo320ZUqdl2ooQ== |
||||||
|
-----END CERTIFICATE----- |
Loading…
Reference in new issue