1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-28 23:42:21 +00:00

vendor: 增加grpc例子

This commit is contained in:
chai2010 2018-07-14 12:52:32 +08:00
parent 6e33b20110
commit 6afef4552c
15 changed files with 504 additions and 0 deletions

View File

@ -0,0 +1,10 @@
run:
@go build -o a.out && ./a.out
-@rm ./a.out
gen:
protoc -I . --go_out=plugins=grpc:. helloworld.proto
clean:
-rm *.pb.go

View File

@ -0,0 +1,14 @@
-----BEGIN CERTIFICATE-----
MIICHzCCAYgCCQDAkKPvNa5BPzANBgkqhkiG9w0BAQUFADBUMQswCQYDVQQGEwJD
TjEOMAwGA1UECAwFaHViZWkxDjAMBgNVBAcMBXd1aGFuMQswCQYDVQQKDAJxYzEL
MAkGA1UECwwCcWMxCzAJBgNVBAMMAnFjMB4XDTE4MDcxMzAyMTE0MVoXDTE5MDcx
MzAyMTE0MVowVDELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBWh1YmVpMQ4wDAYDVQQH
DAV3dWhhbjELMAkGA1UECgwCcWMxCzAJBgNVBAsMAnFjMQswCQYDVQQDDAJxYzCB
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0VwCvu9pALIap5SCgJTLqK61KGq5
hkRTGGyHJsJsqJarT1Bitz+MDzKTLvoos2T6kxeuLruqvhKoBwfN9WwQmUPeM4so
oC2VRj8dlg7XYxt9GNevrwT+pcvBA+KLvE8sWiO9OqY38ZiqG0/FilTZgRI10hFb
4OlMjhlY3t80BAMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQAM/3ZvEflWFb/zsWac
VRjr3q5qwbT4iwrzihAF49BU5+Je9U6nSDugKznumpD77THLGsvtKbHuJcqvzsaF
JI46P4OPg0SJFiTUZArE3L7BfuvdKVzkXy2ecH4ArTvAPuMJ9AGTE7MiwGOObwt2
Z0LIDvk84JQPT95LGJfI2WJf8w==
-----END CERTIFICATE-----

View File

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIBkzCB/QIBADBUMQswCQYDVQQGEwJDTjEOMAwGA1UECAwFaHViZWkxDjAMBgNV
BAcMBXd1aGFuMQswCQYDVQQKDAJxYzELMAkGA1UECwwCcWMxCzAJBgNVBAMMAnFj
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRXAK+72kAshqnlIKAlMuorrUo
armGRFMYbIcmwmyolqtPUGK3P4wPMpMu+iizZPqTF64uu6q+EqgHB831bBCZQ94z
iyigLZVGPx2WDtdjG30Y16+vBP6ly8ED4ou8TyxaI706pjfxmKobT8WKVNmBEjXS
EVvg6UyOGVje3zQEAwIDAQABoAAwDQYJKoZIhvcNAQELBQADgYEAUnEFLf9E7kKl
f2ravOx6alDVGeW4VQbno5cknkmRXqC8Z4aHJZZmjACqVoTTJfgl3zwQ0dBrOi7i
Lkx1WKVy1reT2H+9W3E/HS35ECNfjDQZHazqwKwSiYl3MO0WAtBE1TIG2L2M1Vh0
87gGx1v34zPhq3KG00yvf+ufE6f3Xyk=
-----END CERTIFICATE REQUEST-----

View File

@ -0,0 +1,18 @@
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,61C7BEE93FF2FF7CB0347D22A335BC32
0MUxoD0n/Fywg9cVKASdOiLf6Sx/zQihjpTOsItmCOwSmfRvcuoMJxwrGF0od3HC
6g6ZoQDyIvdqxIK1DM6Lku0AmEzWBabQghvz1SFsmqhNkxxyznq0Yp5ezZfbUPKE
ydshbqNmavvegRa2JvqHggyqU0WsPEARPBTfcFUu9B2+5GzdpjZPlcaALs8+DBqB
ZFNVDZIgfmYNkN3CAHKfGf2btwsFY6GGldO2mvefeO/DuTAXLP9OiCRZS3NE7bJg
ur7N1Nxo8ftyff3Ldde/HlY/f6vSzRIYdkTBBFX5OBS1vX0cFrxoD7Yxa35tx7iI
CBGFNHZEU44yKo3kv9zIpuBE8+opOMtsR9YYJ1yvrSEqODup6ecD0flDIAysKLWR
budW/aLxVsplsGX3peUN61mar0aDyyqrTTLqB0mnktTeVgb9lbdoK+hp3ix/3ChX
RH8c7L0odSlOb+GU91ijKwdNMhAeV2+hAuLaD7l6Pf0cg/ev1AL+DjuOCO7xc8Zv
vJ1CZtfKD53ZoQVNNpMS+KNLWsTkFFn9cq8GVVf4mCE++djTdlu0UKf+N6WE+G0M
IRgB5/xifBauznwsc+3cy7kpTKxH6Nt/OMPg2f5ZEB5EGgckQJw1NhmXlxRb7qbL
5FOnAC99h130KrmmCXo5xdeIxfdFzZY4SY4sCI0mbangFYcGibwSwab443KL4y53
2L6+yDOFSSjCVVW75v8/2furs0TDT0G9O0swI5x4soW54BnzldI+RBJFjkY6F1Bh
x6KhbaGj/mzXRPfUDCefaBKiRbmHe6sLcmAb2xc62Vo5TGLWAmKTAPpK3h5LxUQh
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,14 @@
-----BEGIN CERTIFICATE-----
MIICKzCCAZQCCQCLijGZ94Ye3jANBgkqhkiG9w0BAQUFADBUMQswCQYDVQQGEwJD
TjEOMAwGA1UECAwFaHViZWkxDjAMBgNVBAcMBXd1aGFuMQswCQYDVQQKDAJxYzEL
MAkGA1UECwwCcWMxCzAJBgNVBAMMAnFjMB4XDTE4MDcxMzAyMTk1OVoXDTE5MDcx
MzAyMTk1OVowYDELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBWh1YmVpMQ4wDAYDVQQH
DAV3dWhhbjEPMA0GA1UECgwGY2xpZW50MQ8wDQYDVQQLDAZjbGllbnQxDzANBgNV
BAMMBmNsaWVudDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAw+3m7DVsk/G4
Si5IZ9x1NRIEYaEFUcTabfakiAXiRbbVkQcnyPT4msJ78sroieg0Bybw+iG5qngc
liGSbOvhSgLEd0CLleh/waqQiFxHyE3Sk2HWGjtDsDlRJy09fnzZmY+jut8FcwZG
L0QPHb/FYgw7/nNR4lfjQ/5TV3ioVoUCAwEAATANBgkqhkiG9w0BAQUFAAOBgQDE
/E61EZxLduU9cf2JglmcRrGGLWPYazWZTx1gvP+EX5X/Hn9Vh5NsSsHE96l+7ktK
mP9nJyXZ9VVBDf1tbcFeRtIZY9x2YioaNY9kvWpxgwMjihUkp/iRZTV7EO1h8TVc
mrjoDdKfQhRXru5U6g43bUVTSFarfs5S0NVvdkuiqw==
-----END CERTIFICATE-----

View File

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIBoDCCAQkCAQAwYDELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBWh1YmVpMQ4wDAYD
VQQHDAV3dWhhbjEPMA0GA1UECgwGY2xpZW50MQ8wDQYDVQQLDAZjbGllbnQxDzAN
BgNVBAMMBmNsaWVudDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAw+3m7DVs
k/G4Si5IZ9x1NRIEYaEFUcTabfakiAXiRbbVkQcnyPT4msJ78sroieg0Bybw+iG5
qngcliGSbOvhSgLEd0CLleh/waqQiFxHyE3Sk2HWGjtDsDlRJy09fnzZmY+jut8F
cwZGL0QPHb/FYgw7/nNR4lfjQ/5TV3ioVoUCAwEAAaAAMA0GCSqGSIb3DQEBCwUA
A4GBAC7xBqiNKJzt4TXvy8y7514Im8FvrHaZtT8QaCZyzQ5CDkeTY2entzS9XGQ2
6LVASzhblfHjWR8WdZcT+SEVDJZ96Xmy+c0+QK9cObtDqiX08XFj4Lx7Edf2PzP+
iglDGQ6jNR64YLmyw5sTorOnk6a1rPGXyJSwy/pnWgnzyUhz
-----END CERTIFICATE REQUEST-----

View File

@ -0,0 +1,18 @@
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,75444A607F4C68746F58AD016EFC7A02
EklVHcebRSvB6Y3val2+bl2O9SFqrbalS78DB9+cXvJ7pqDo7JKYLHxmX9Zh+kWU
2LkbMeLOxemn1AhJIzUmfIsYv0kPWQZYp6yn/GDYFq034RjerDqYo78ND1OnRI37
5i85xxpvc6r8xXRNeDxeh/hQbpdHqYDr8TUpbxnqSSvFSpuREBrGOZ82Q8zcIB0m
+QP/zcLXi2YIfYilM1D4+o/a1GS/efhQCn0hk6nz0p0wfq4pPjiJYgCA62ac4p+l
KoyXlfECh5PbEwtnBtMr2mIE8xobmvV2q5QeYq530bTaRh65Gk0b2jYcpi4ck4aI
/cQRsTF7ttVFQf2I7aOSn9XWs2bpq3UmbiLyBQMDGVQ2+8oN7KOxu3irS0KRxCL+
kNIW+XHRPA8dtl5yS2GhZ+zTDQVWvg1yURNCLc5qn1soFybNOa/U/4G7bikBVOcB
wrMYnBanKMoDKmFibcdFu8aafQvgs1dG5uOyRb6cjkmlNio9lT+mDhWAHxvk+dZC
RFnxi6QSotZya5g22894P+qnKKygN/X2ahquITMbJ3eO6Kx9PcZcEAfGQjKp22zp
b0TAPGWiARg53kypm5EZzp7nSgbgpaR2z9JPj3MgglP56bWc3sAOfKYXMAn/xWXm
fXM06gY2bB7YH6Md7O964NZ7Uf+Egvswwrn8j+n8rLF1AvAf+tPD7AY0+HFoCHDf
3jg9F+J5fD5D7yVgS2UAHPgr1ahtXPeOw9nNpEWRey20qjgHImfUG3DtdGNB3gKn
SkSbkIJDiM4kDymBpDGqZlkS3gJo0udBJEVyF/uLr+FhMAy+ttwOyie0wgcMHMew
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDD7ebsNWyT8bhKLkhn3HU1EgRhoQVRxNpt9qSIBeJFttWRByfI
9PiawnvyyuiJ6DQHJvD6IbmqeByWIZJs6+FKAsR3QIuV6H/BqpCIXEfITdKTYdYa
O0OwOVEnLT1+fNmZj6O63wVzBkYvRA8dv8ViDDv+c1HiV+ND/lNXeKhWhQIDAQAB
AoGAfBbZkTKI0O5fvMOxYe5TYUhG9BpKRy549Pon3Gp1k5enjVHN1c2pAkM4w13V
hzpEcV8tcg4YDCpEWKVsmoWOSfapZtXlXoEU9vlWFj6LWok5TCg3BbTVEauUUSeI
naPIYfkSB2gUshvuhXjaevWxLbyW4h6fU7eCbA47FZSqggECQQD93XeB5iU7wxwm
6rBoTxvFiFk0pqT57f7wnI/GHfChdbcAmVjRJuT2VR3wrcejyNwzeaPdn8TZjEpO
ZP6dEXsFAkEAxZO1TK3vyXNU3t3kNdtFuHQ7j6HOc9MKWMjXZizDnihjKETt73mA
1C34d8NtdXvuYiVFrGCoPEcA/FW3wr1FgQJBAKXoLIf6Lm8mDanpSqyAtrebaiEc
n0ivHyOETfm961q5oYWEsiTN9GiAK/b0uznwtOf3IP5fwbgjFRSysCtaFzkCQDBk
gV+KqtS4vuznhGH8lxMaxQvlIeAUrNAaQUfxZuhyE/dlCrJBHGDb8aPD5ieEd1rq
rioOcqZw7bjgdeXo3gECQEYm3HDcLFw5VluHB9/tiD/DSe3LbHdhB3/gjpYAcgE5
RBI6VN/m6Mhz4fnAg3ATWRg8Pd7yF41igBd2ekAdPos=
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,192 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: helloworld.proto
package main
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import (
context "golang.org/x/net/context"
grpc "google.golang.org/grpc"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type HelloRequest struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *HelloRequest) Reset() { *m = HelloRequest{} }
func (m *HelloRequest) String() string { return proto.CompactTextString(m) }
func (*HelloRequest) ProtoMessage() {}
func (*HelloRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_helloworld_04dfe859c9b956ba, []int{0}
}
func (m *HelloRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HelloRequest.Unmarshal(m, b)
}
func (m *HelloRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_HelloRequest.Marshal(b, m, deterministic)
}
func (dst *HelloRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_HelloRequest.Merge(dst, src)
}
func (m *HelloRequest) XXX_Size() int {
return xxx_messageInfo_HelloRequest.Size(m)
}
func (m *HelloRequest) XXX_DiscardUnknown() {
xxx_messageInfo_HelloRequest.DiscardUnknown(m)
}
var xxx_messageInfo_HelloRequest proto.InternalMessageInfo
func (m *HelloRequest) GetName() string {
if m != nil {
return m.Name
}
return ""
}
type HelloReply struct {
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *HelloReply) Reset() { *m = HelloReply{} }
func (m *HelloReply) String() string { return proto.CompactTextString(m) }
func (*HelloReply) ProtoMessage() {}
func (*HelloReply) Descriptor() ([]byte, []int) {
return fileDescriptor_helloworld_04dfe859c9b956ba, []int{1}
}
func (m *HelloReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HelloReply.Unmarshal(m, b)
}
func (m *HelloReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_HelloReply.Marshal(b, m, deterministic)
}
func (dst *HelloReply) XXX_Merge(src proto.Message) {
xxx_messageInfo_HelloReply.Merge(dst, src)
}
func (m *HelloReply) XXX_Size() int {
return xxx_messageInfo_HelloReply.Size(m)
}
func (m *HelloReply) XXX_DiscardUnknown() {
xxx_messageInfo_HelloReply.DiscardUnknown(m)
}
var xxx_messageInfo_HelloReply proto.InternalMessageInfo
func (m *HelloReply) GetMessage() string {
if m != nil {
return m.Message
}
return ""
}
func init() {
proto.RegisterType((*HelloRequest)(nil), "main.HelloRequest")
proto.RegisterType((*HelloReply)(nil), "main.HelloReply")
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4
// GreeterClient is the client API for Greeter service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type GreeterClient interface {
SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
}
type greeterClient struct {
cc *grpc.ClientConn
}
func NewGreeterClient(cc *grpc.ClientConn) GreeterClient {
return &greeterClient{cc}
}
func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) {
out := new(HelloReply)
err := c.cc.Invoke(ctx, "/main.Greeter/SayHello", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// GreeterServer is the server API for Greeter service.
type GreeterServer interface {
SayHello(context.Context, *HelloRequest) (*HelloReply, error)
}
func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) {
s.RegisterService(&_Greeter_serviceDesc, srv)
}
func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(HelloRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(GreeterServer).SayHello(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/main.Greeter/SayHello",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Greeter_serviceDesc = grpc.ServiceDesc{
ServiceName: "main.Greeter",
HandlerType: (*GreeterServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "SayHello",
Handler: _Greeter_SayHello_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "helloworld.proto",
}
func init() { proto.RegisterFile("helloworld.proto", fileDescriptor_helloworld_04dfe859c9b956ba) }
var fileDescriptor_helloworld_04dfe859c9b956ba = []byte{
// 142 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xc8, 0x48, 0xcd, 0xc9,
0xc9, 0x2f, 0xcf, 0x2f, 0xca, 0x49, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0xc9, 0x4d,
0xcc, 0xcc, 0x53, 0x52, 0xe2, 0xe2, 0xf1, 0x00, 0xc9, 0x04, 0xa5, 0x16, 0x96, 0xa6, 0x16, 0x97,
0x08, 0x09, 0x71, 0xb1, 0xe4, 0x25, 0xe6, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0x81,
0xd9, 0x4a, 0x6a, 0x5c, 0x5c, 0x50, 0x35, 0x05, 0x39, 0x95, 0x42, 0x12, 0x5c, 0xec, 0xb9, 0xa9,
0xc5, 0xc5, 0x89, 0xe9, 0x30, 0x45, 0x30, 0xae, 0x91, 0x35, 0x17, 0xbb, 0x7b, 0x51, 0x6a, 0x6a,
0x49, 0x6a, 0x91, 0x90, 0x01, 0x17, 0x47, 0x70, 0x62, 0x25, 0x58, 0x97, 0x90, 0x90, 0x1e, 0xc8,
0x26, 0x3d, 0x64, 0x6b, 0xa4, 0x04, 0x50, 0xc4, 0x0a, 0x72, 0x2a, 0x93, 0xd8, 0xc0, 0xae, 0x32,
0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x18, 0x38, 0x13, 0xf1, 0xa9, 0x00, 0x00, 0x00,
}

View File

@ -0,0 +1,15 @@
syntax = "proto3";
package main;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}

View File

@ -0,0 +1,128 @@
package main
import (
"log"
"net"
"time"
"crypto/tls"
"crypto/x509"
"io/ioutil"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/reflection"
)
var (
port = ":5000"
ca = "./ca.cer"
server_crt = "./server.cer"
server_key = "./server_pri.key"
client_crt = "./client.cer"
client_key = "./client_pri.key"
)
type server struct{}
func (s *server) SayHello(ctx context.Context, in *HelloRequest) (*HelloReply, error) {
return &HelloReply{Message: "Hello " + in.Name}, nil
}
func main() {
go startServer()
time.Sleep(time.Second)
doClientWork()
}
func startServer() {
// Load the certificates from disk
certificate, err := tls.LoadX509KeyPair(server_crt, server_key)
if err != nil {
log.Panicf("could not load server key pair: %s", err)
}
// Create a certificate pool from the certificate authority
certPool := x509.NewCertPool()
ca, err := ioutil.ReadFile(ca)
if err != nil {
log.Panicf("could not read ca certificate: %s", err)
}
// Append the client certificates from the CA
if ok := certPool.AppendCertsFromPEM(ca); !ok {
log.Panic("failed to append client certs")
}
// Create the channel to listen on
lis, err := net.Listen("tcp", port)
if err != nil {
log.Panicf("could not list on %s: %s", port, err)
}
// Create the TLS credentials
creds := credentials.NewTLS(&tls.Config{
ClientAuth: tls.RequireAndVerifyClientCert,
Certificates: []tls.Certificate{certificate},
ClientCAs: certPool,
})
// Create the gRPC server with the credentials
s := grpc.NewServer(grpc.Creds(creds))
// Register the handler object
RegisterGreeterServer(s, &server{})
// Serve and Listen
if err := s.Serve(lis); err != nil {
log.Panicf("grpc serve error: %s", err)
}
// Register reflection service on gRPC server.
reflection.Register(s)
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
func doClientWork() {
certificate, err := tls.LoadX509KeyPair(client_crt, client_key)
if err != nil {
log.Panicf("could not load client key pair: %s", err)
}
// Create a certificate pool from the certificate authority
certPool := x509.NewCertPool()
ca, err := ioutil.ReadFile(ca)
if err != nil {
log.Panicf("could not read ca certificate: %s", err)
}
// Append the certificates from the CA
if ok := certPool.AppendCertsFromPEM(ca); !ok {
log.Panic("failed to append ca certs")
}
creds := credentials.NewTLS(&tls.Config{
ServerName: "server", // NOTE: this is required!
Certificates: []tls.Certificate{certificate},
RootCAs: certPool,
})
// Create a connection with the TLS credentials
conn, err := grpc.Dial("localhost"+port, grpc.WithTransportCredentials(creds))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
c := NewGreeterClient(conn)
r, err := c.SayHello(context.Background(), &HelloRequest{Name: "gopher"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("doClientWork: %s", r.Message)
}

View File

@ -0,0 +1,14 @@
-----BEGIN CERTIFICATE-----
MIICKzCCAZQCCQCLijGZ94Ye3TANBgkqhkiG9w0BAQUFADBUMQswCQYDVQQGEwJD
TjEOMAwGA1UECAwFaHViZWkxDjAMBgNVBAcMBXd1aGFuMQswCQYDVQQKDAJxYzEL
MAkGA1UECwwCcWMxCzAJBgNVBAMMAnFjMB4XDTE4MDcxMzAyMTcwMloXDTE5MDcx
MzAyMTcwMlowYDELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBWh1YmVpMQ4wDAYDVQQH
DAV3dWhhbjEPMA0GA1UECgwGc2VydmVyMQ8wDQYDVQQLDAZzZXJ2ZXIxDzANBgNV
BAMMBnNlcnZlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0O7DxTXSJoT0
6SwvTtpYjBgNpZPjDq0nXsl7l15Cg8odCZGoycdjhuC4WW5Xy8wzyVr2/VT1BufL
S0/JDW2RlYaRNtgB4Zny6PtBSfdbF+2jdXjHkiMGdTY5K9rHWYMxG5VvM9xXcrA3
v/va3LRi9UHGxZc6LWPnGl0KBH0C7KMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQCq
XuZkfUlRuRR3zFiHE1s0R0vCIS2rrxngxlIhMEXXm+5SO31DPhm9Mo9xOh6dqQy3
UsUKalXlT1DAwZZEzOgT0U95t4w2T44BuVz+wKSN2HsifuucX3pg+5E0NjJispBA
6ffICSdQVoObXqn34OFRRSsRawWMQJwtH8iJrZS73Q==
-----END CERTIFICATE-----

View File

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIBoDCCAQkCAQAwYDELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBWh1YmVpMQ4wDAYD
VQQHDAV3dWhhbjEPMA0GA1UECgwGc2VydmVyMQ8wDQYDVQQLDAZzZXJ2ZXIxDzAN
BgNVBAMMBnNlcnZlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0O7DxTXS
JoT06SwvTtpYjBgNpZPjDq0nXsl7l15Cg8odCZGoycdjhuC4WW5Xy8wzyVr2/VT1
BufLS0/JDW2RlYaRNtgB4Zny6PtBSfdbF+2jdXjHkiMGdTY5K9rHWYMxG5VvM9xX
crA3v/va3LRi9UHGxZc6LWPnGl0KBH0C7KMCAwEAAaAAMA0GCSqGSIb3DQEBCwUA
A4GBAFHLKXrfzuWXNUrORFlRIEuIxOkKSlFnJc+LNw4Pb7/acbx2yWnoMcofeVuo
cgi1JPcqXcVnIkfBJz66UrtjyXTI2ErnmWwX/qIbQWaZRxtlNEWKHFOj8ujK/mQ1
maP4IoZdzF643c6DBlWA5MwZ8Cd8HWRsq6JP4o2ehq+cIhxU
-----END CERTIFICATE REQUEST-----

View File

@ -0,0 +1,18 @@
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,DD0D53C9377DB7A137DB6E2F79A2D1FF
PLhsTZMlDyo7CtSQUs64Kui3V//B+n9Lnk9hyzmdZOPC54pcokgIw8WGHAVEzJsN
F4RzUWXiuUo9WVPAwkXuqpi7/BwOwQAah7omw6QyEuFWjAUeFahxmLPkhubiNWfd
km+XWoWtBW/am/O0ThlW8f7m4FNLn8WqQxYW05lnKSALfhHR7lkkvP7w3+K09cYG
wKa9JAWKrzcgGaK9/R34ZN0RpkGhkBXGeNAGL4IX8UR2CI6KM/Xzpe73pd6f4Wt9
msKf2OkpoW/Bq15VOhazMCWX8PQr+VumSWAgBLvip8HbmA0Sp7DOP3N/NQGtmy8J
G3cXEjAtUMDgi2VF5jL8haEcKb1Cx6koAOJIpSTMwm/IcEP0kZ/IHnRHrU6yuSBP
+1nfz3LjngKMcw7JWK/UxY5lvWvttsxblk2+w9keM6gz0XKH4hygyL0ckNy3mRgq
MmVcDM1/H5J49yN66WnK9S49CnLVWFxvtpty5tiEqgi/NTqBcQ8dNTK+IqXxJMPT
glHt3QEZF06tJFzVAXNCEID/hjhVvS0Kpiz6BRRQdQdlN4eiADHxfQKHkzilvmU/
mjFwqEfSghlReqL3CFv+OGVzRipr/0KzNYqP5ya3ocP1Whhq541+uFVGAJEPEtWm
cbQEHafUhjEt2a50eBlTYvnaVWqf83MbuGuvisJenSSkEHbZyF4BYyWT6UcgpRgm
RP3NTnXp6j/nNkUAOr55QXR9NzONqBw4uLYqKp0eaMEAucq7dNUiobRG+NhEt/st
NGmrkq9+DX1jxsCXZSDDoL+qcN7bnBIJc2Hx3RwKFXci0KBVZABQz18atmbA5ygc
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDQ7sPFNdImhPTpLC9O2liMGA2lk+MOrSdeyXuXXkKDyh0JkajJ
x2OG4LhZblfLzDPJWvb9VPUG58tLT8kNbZGVhpE22AHhmfLo+0FJ91sX7aN1eMeS
IwZ1Njkr2sdZgzEblW8z3FdysDe/+9rctGL1QcbFlzotY+caXQoEfQLsowIDAQAB
AoGAOFKVPd2TaEThTNZXbndX9XQqgZ9LT1KIUXoZMiX74lEi4Mh+at6wStTbfWhM
jKjgsQAvov07DICCAixg85i87MhkRLZNgBi6/qRj/uPwk+7Wce3QxppvLjAtpLcq
0ucJYCEMwCncajEj0BeQztec2fkn8A5NCQP6QWfKEJV0ktECQQDq0h+yKU0v5r8/
E6Vz2YXYhFTFrzIzDzfI/Y9/cqXzEO1qbYElAnbZw1thmexpeKnvobNtNPpBWZkm
blPDHN1ZAkEA48bmMPxokDL6JLO3nOLnXcjxXtpZqPdrV1reLKZaa7UjXdcfXrcn
mtduRs42jMrioN8yGOfsva6Q59i7h0RuWwJACh5Tz1GISfAffZBTKNLOua26GWqb
NygIt1h1voAqNnccQ+HEFtwsUuXgIiyHy2OvruvA14vY3MgHmWhXo6iywQJAL/gx
fluKAeRafeRDZQz8QOoSuzEs9MK2nn0KkUivfkN1oUuu1ZmpA5kfJlZDcr8/nzWi
LVCasQ/UgJ9KTyCARQJBAK+2jSCLjO7idDzrtSBl0UUH4TVGzB6Z7jcryyxkeO4q
x10JT7UYLzHO8IzXd/DKhe9QzgsMGs0g99sTY1NtSK0=
-----END RSA PRIVATE KEY-----