Commit 88e31175f07eb3b27f7dbc0bc2f3fdfd9dd0f46c
1 parent
b6e571c3
grpc 增加tls, 使用san证书
Showing
12 changed files
with
607 additions
and
9 deletions
Show diff stats
Makefile
@@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
2 | 2 | ||
3 | all: ge build run | 3 | all: ge build run |
4 | 4 | ||
5 | -ge: | 5 | +gen: |
6 | protoc -I./protos --go_out=./protos --go-grpc_out=./protos ./protos/*proto | 6 | protoc -I./protos --go_out=./protos --go-grpc_out=./protos ./protos/*proto |
7 | protoc-go-inject-tag -input=./protos/pb/*.pb.go | 7 | protoc-go-inject-tag -input=./protos/pb/*.pb.go |
8 | 8 | ||
@@ -16,4 +16,19 @@ build: | @@ -16,4 +16,19 @@ build: | ||
16 | go build -o bin/account account.go | 16 | go build -o bin/account account.go |
17 | go build -o bin/game game.go | 17 | go build -o bin/game game.go |
18 | 18 | ||
19 | +cert: | ||
20 | + openssl req \ | ||
21 | + -x509 \ | ||
22 | + -nodes \ | ||
23 | + -newkey rsa:2048 \ | ||
24 | + -keyout keys/ca.key \ | ||
25 | + -out keys/ca.crt \ | ||
26 | + -days 3650 \ | ||
27 | + -subj "/C=CN/ST=ZheJiang/L=ZheJiang/O=Global/CN=pro2d Security/OU=IT Department/CN=pro2d" | ||
28 | + openssl genpkey -algorithm RSA -out keys/server.key | ||
29 | + openssl req -new -nodes -key keys/server.key -out keys/server.csr -days 3650 -subj "/C=CN/OU=IT/O=Global/CN=pro2d/L=ZheJiang" -config keys/openssl.cnf -extensions v3_req | ||
30 | + openssl x509 -req -days 365 -in keys/server.csr -out keys/server.pem -CA keys/ca.crt -CAkey keys/ca.key -CAcreateserial -extfile keys/openssl.cnf -extensions v3_req | ||
31 | + | ||
32 | + | ||
33 | + | ||
19 | .PHONY: all build protos test | 34 | .PHONY: all build protos test |
20 | \ No newline at end of file | 35 | \ No newline at end of file |
README.md
@@ -24,6 +24,10 @@ $ go install google.golang.org/protobuf/cmd/protoc-gen-go | @@ -24,6 +24,10 @@ $ go install google.golang.org/protobuf/cmd/protoc-gen-go | ||
24 | $ go get google.golang.org/grpc/cmd/protoc-gen-go-grpc | 24 | $ go get google.golang.org/grpc/cmd/protoc-gen-go-grpc |
25 | $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc | 25 | $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc |
26 | ``` | 26 | ``` |
27 | +## 文档 | ||
28 | +[证书制作](doc/cret.md) | ||
29 | + | ||
30 | + | ||
27 | ## Usage | 31 | ## Usage |
28 | 编译 & 运行 | 32 | 编译 & 运行 |
29 | ```shell | 33 | ```shell |
actions/server.go
@@ -4,6 +4,7 @@ import ( | @@ -4,6 +4,7 @@ import ( | ||
4 | "context" | 4 | "context" |
5 | "fmt" | 5 | "fmt" |
6 | "google.golang.org/grpc" | 6 | "google.golang.org/grpc" |
7 | + "google.golang.org/grpc/credentials" | ||
7 | "google.golang.org/grpc/reflection" | 8 | "google.golang.org/grpc/reflection" |
8 | "pro2d/conf" | 9 | "pro2d/conf" |
9 | "pro2d/models" | 10 | "pro2d/models" |
@@ -39,15 +40,27 @@ func (s *LoginServer)Start() error { | @@ -39,15 +40,27 @@ func (s *LoginServer)Start() error { | ||
39 | 40 | ||
40 | models.InitAccountServerModels() | 41 | models.InitAccountServerModels() |
41 | 42 | ||
43 | + var opts []grpc.ServerOption | ||
44 | + //TLS | ||
45 | + creds, err := credentials.NewServerTLSFromFile("keys/server.pem", "keys/server.key") | ||
46 | + if err != nil { | ||
47 | + utils.Sugar.Errorf("Failed to generate credentials %v", err) | ||
48 | + return err | ||
49 | + } | ||
50 | + opts = append(opts, grpc.Creds(creds)) | ||
51 | + | ||
52 | + //拦截器 | ||
53 | + opts = append(opts, grpc.UnaryInterceptor(AccountServerInterceptor)) | ||
54 | + | ||
42 | //new一个grpc | 55 | //new一个grpc |
43 | - s.GrpcServer = grpc.NewServer(grpc.UnaryInterceptor(AccountServerInterceptor)) | 56 | + s.GrpcServer = grpc.NewServer(opts...) |
44 | 57 | ||
45 | pb.RegisterLoginServer(s.GrpcServer, s) | 58 | pb.RegisterLoginServer(s.GrpcServer, s) |
46 | reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务 | 59 | reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务 |
47 | 60 | ||
48 | // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。 | 61 | // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。 |
49 | // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。 | 62 | // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。 |
50 | - utils.Sugar.Debugf("Start LoginServer listening on %d", conf.GlobalConf.AccountConf.Port) | 63 | + utils.Sugar.Debugf("Start LoginServer listening on %d with TLS", conf.GlobalConf.AccountConf.Port) |
51 | 64 | ||
52 | return s.GrpcServer.Serve(lis) | 65 | return s.GrpcServer.Serve(lis) |
53 | } | 66 | } |
@@ -88,15 +101,27 @@ func (s *GameServer)Start() error { | @@ -88,15 +101,27 @@ func (s *GameServer)Start() error { | ||
88 | 101 | ||
89 | models.InitGameServerModels() | 102 | models.InitGameServerModels() |
90 | 103 | ||
104 | + var opts []grpc.ServerOption | ||
105 | + //TLS | ||
106 | + creds, err := credentials.NewServerTLSFromFile("keys/server.pem", "keys/server.key") | ||
107 | + if err != nil { | ||
108 | + utils.Sugar.Errorf("Failed to generate credentials %v", err) | ||
109 | + return err | ||
110 | + } | ||
111 | + opts = append(opts, grpc.Creds(creds)) | ||
112 | + | ||
113 | + //拦截器 | ||
114 | + opts = append(opts, grpc.UnaryInterceptor(GameServerInterceptor)) | ||
115 | + | ||
91 | //new一个grpc | 116 | //new一个grpc |
92 | - s.GrpcServer = grpc.NewServer(grpc.UnaryInterceptor(GameServerInterceptor)) | 117 | + s.GrpcServer = grpc.NewServer(opts...) |
93 | 118 | ||
94 | pb.RegisterGameServer(s.GrpcServer, s) | 119 | pb.RegisterGameServer(s.GrpcServer, s) |
95 | reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务 | 120 | reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务 |
96 | 121 | ||
97 | // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。 | 122 | // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。 |
98 | // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。 | 123 | // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。 |
99 | - utils.Sugar.Debugf("Start GameServer listening on %d", conf.GlobalConf.GameConf.Port) | 124 | + utils.Sugar.Debugf("Start GameServer listening on %d with TLS", conf.GlobalConf.GameConf.Port) |
100 | return s.GrpcServer.Serve(lis) | 125 | return s.GrpcServer.Serve(lis) |
101 | } | 126 | } |
102 | 127 |
@@ -0,0 +1,46 @@ | @@ -0,0 +1,46 @@ | ||
1 | +## 证书制作 | ||
2 | + | ||
3 | +## ca证书生成流程(在升级版本的GO中已经不支持读取) | ||
4 | +使用-subj参数,指定服务器的相关信息,与之前的不同,此时不需要引导输入。 | ||
5 | +```shell | ||
6 | +openssl req \ | ||
7 | + -x509 \ | ||
8 | + -nodes \ | ||
9 | + -newkey rsa:2048 \ | ||
10 | + -keyout ca.key \ | ||
11 | + -out ca.crt \ | ||
12 | + -days 3650 \ | ||
13 | + -subj "/C=CN/ST=ZheJiang/L=ZheJiang/O=Global/CN=pro2d Security/OU=IT Department/CN=pro2d" | ||
14 | +``` | ||
15 | + | ||
16 | +### SAN证书生成(使用开启扩展SAN的证书) | ||
17 | +生成私钥 | ||
18 | +```shell | ||
19 | +$ openssl genpkey -algorithm RSA -out server.key | ||
20 | +``` | ||
21 | +根据私钥server.key生成证书请求文件server.csr: | ||
22 | +```shell | ||
23 | +openssl req -new -nodes -key server.key -out server.csr -days 3650 \ | ||
24 | + -subj "/C=CN/OU=IT/O=Global/CN=pro2d/L=ZheJiang" \ | ||
25 | + -config openssl.cnf -extensions v3_req | ||
26 | +``` | ||
27 | +验证证书CSR的扩展属性 | ||
28 | +```shell | ||
29 | +$ openssl req -noout -text -in server.csr | ||
30 | +``` | ||
31 | + | ||
32 | +生成san证书 | ||
33 | +```shell | ||
34 | +$ openssl x509 -req -days 365 -in server.csr -out server.pem \ | ||
35 | + -CA ca.crt -CAkey ca.key -CAcreateserial \ | ||
36 | + -extfile openssl.cnf -extensions v3_req | ||
37 | +``` | ||
38 | +* server.csr是前面步骤生成的证书请求文件。 | ||
39 | +* ca.crt & ca.key 是CA证书文件和key,用来对server.csr进行签名认证。 | ||
40 | + | ||
41 | +查看SAN信息在证书内容 | ||
42 | +```shell | ||
43 | +$ openssl x509 -noout -text -in server.pem | ||
44 | +``` | ||
45 | + | ||
46 | +现在证书已经生成完毕, server.pem 和 server.key正式我们需要的证书和密钥 |
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +-----BEGIN CERTIFICATE----- | ||
2 | +MIIDiDCCAnACCQDvizTzfA5snjANBgkqhkiG9w0BAQsFADCBhTELMAkGA1UEBhMC | ||
3 | +Q04xETAPBgNVBAgMCFpoZUppYW5nMREwDwYDVQQHDAhaaGVKaWFuZzEPMA0GA1UE | ||
4 | +CgwGR2xvYmFsMRcwFQYDVQQDDA5wcm8yZCBTZWN1cml0eTEWMBQGA1UECwwNSVQg | ||
5 | +RGVwYXJ0bWVudDEOMAwGA1UEAwwFcHJvMmQwHhcNMjIwMjIyMDYwNzIzWhcNMzIw | ||
6 | +MjIwMDYwNzIzWjCBhTELMAkGA1UEBhMCQ04xETAPBgNVBAgMCFpoZUppYW5nMREw | ||
7 | +DwYDVQQHDAhaaGVKaWFuZzEPMA0GA1UECgwGR2xvYmFsMRcwFQYDVQQDDA5wcm8y | ||
8 | +ZCBTZWN1cml0eTEWMBQGA1UECwwNSVQgRGVwYXJ0bWVudDEOMAwGA1UEAwwFcHJv | ||
9 | +MmQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+eik5acnrHwEz+Zwb | ||
10 | +j7R1eCb9VrJymCii7PtCeeqCZaRBuUYUwKSkEdv367HRH00CW2tYCMMsoBqBewxO | ||
11 | +tBwa+1rpCbUvqWdmipMTjE4vmA5Kb50HS3/VxTlnICPb0P0CO2kArrktEPg3W7c5 | ||
12 | +Xwmbe8BvYtdEV/BkLUG0+NQbXfXgkKBEs6t1FOqtJAubURann3wAH9pLIDRUcj5B | ||
13 | +QzM9b+8qvTjLLj4/uaac4b7X6bfVyaeX8cWOXLHDYEXwIdlRXYz4l+gSVO/EKIgA | ||
14 | +5QfwLJTWuxnzcM/klOPsIamQtOYIwEkc1KiCNPZ2CAkzXFspKweR1IwsDM8N/hUU | ||
15 | +BWxZAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFzY2wB6phXffFwAcGQZx9FYY9S5 | ||
16 | +3L0Xm4mji50+e6UA+N9MjO/4SXNpjt6qMQ3zwSUalapmr8uh9DWLsjRv6HRvgoIm | ||
17 | +9tkx8UQkjOoFKcee2+Z780BjsR7SI1HS3VLKUOjm8avKazFGGxjsOtayxzGytAT2 | ||
18 | +DK1ubsqSbiK7hFFJqU3cUPP7D3pJOAKaBnLq8MA63vSGTsz2sQUR2Y5DKMXpIhEQ | ||
19 | +zlSQvMzsQXv0yll3DhPv76yV6ZKQzCHCoqaPBNU+9QhrWFqIP2QXLR5smeFqOGQM | ||
20 | +ngBFwwv9ysSMmcpanMePiuuvXykZiPJpknxdAxry6+A8+/KQ/07hFAHarbI= | ||
21 | +-----END CERTIFICATE----- |
@@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
1 | +-----BEGIN PRIVATE KEY----- | ||
2 | +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC+eik5acnrHwEz | ||
3 | ++Zwbj7R1eCb9VrJymCii7PtCeeqCZaRBuUYUwKSkEdv367HRH00CW2tYCMMsoBqB | ||
4 | +ewxOtBwa+1rpCbUvqWdmipMTjE4vmA5Kb50HS3/VxTlnICPb0P0CO2kArrktEPg3 | ||
5 | +W7c5Xwmbe8BvYtdEV/BkLUG0+NQbXfXgkKBEs6t1FOqtJAubURann3wAH9pLIDRU | ||
6 | +cj5BQzM9b+8qvTjLLj4/uaac4b7X6bfVyaeX8cWOXLHDYEXwIdlRXYz4l+gSVO/E | ||
7 | +KIgA5QfwLJTWuxnzcM/klOPsIamQtOYIwEkc1KiCNPZ2CAkzXFspKweR1IwsDM8N | ||
8 | +/hUUBWxZAgMBAAECggEATl/Jkpwavyn0vsQYHacVo7gaoucHaet93PwRrpqniZv0 | ||
9 | +6C4pzeQuWmwWzH4onll4wF2JX6HLXRNLlLdiqwelAN0n3PdnnALiTuj593MlwKOa | ||
10 | +Tbp7LEM+iGEsa2hoGMx3LnHvlJ5QB2ESIQUV8P9P3rAe0DYlSTO98BpHDQXNkKx0 | ||
11 | +UPo85k5IgnjueeHdxn8lokQsKXN5R8bS9GduRaEyMR/SHrT3T6YmRKr666N/AQas | ||
12 | +7dDe9qGwTpUFympP3PEX/VHQsF9x3/ng6wbRsiijKsUUeGpbslulKi5kHw3j+5Eo | ||
13 | +YkeHjH/iMySd41m4oszM4QmCYr5t49AAQl2bYW3b4QKBgQDxFW297lVS8O+z/ANR | ||
14 | +yVKI7iejiLKdpc0wlZiFWkAKCve+SCGJ2GZ907NKzLq1O6/byhs7XCu229oLvIFm | ||
15 | +/e1sCxdHR/bEf3CTlgoQYXiya0jCgF2GUM/hZpvWZHL0ECZfhwPsks4NWhdKEPyD | ||
16 | +9XWpjfC0qlVh18xAF7Zyrw4sTQKBgQDKQyp/wJub0UZ9FmaLORpxr7rO5pROEFov | ||
17 | +SiwoJ8gYLo7eU0QT6ipVD/vOTE2+5FdYuk41euYZLOzR0N72kqddUlVAtq9bly92 | ||
18 | +sjtvM8iPSGU5cN0D+Up9KT0ZU3zIXH1mVFHsNmm62uN4B3s9Rs+0JvLTI6OwqLAW | ||
19 | +LtyqK09WPQKBgEOFP+YpASaoqknbdEaMvxvwr5Nirrvueuh3jW8T1sm5Rqe5ZgNI | ||
20 | +Y3QsPZPegRBPNjK1iSj36JpfOtN8qTViOwO+m3dwVVG1a586L3llAzvdRlSLRSZg | ||
21 | +LciwR0clfPiUKVsp4lR4zVL5/3nUBhUjQyAIy/idmCo+GUt+GLBIDQ0lAoGABnmT | ||
22 | ++Lb/xEM00HhRHA/d6tnHTyxOfxlC6dSkCT0MyMlkxXVA7qpGZKa4VuhWbM/+g9ai | ||
23 | +/k9K4m9vvV/EY3xaY0BpfkLa5kG2wUP/ZxXvS7bzlp0oViI64jrZu9/SVM+xK/9z | ||
24 | +B+7N/69WLNeAeHu11nyQtXWkndkome0yHzh3t7kCgYBM/U2XmSx0LYHqe+699NXy | ||
25 | +4ey3B4IQHb55Fw8LNiaI96ylQG43kNQpZUELjaPBTpQ1a76uL0bRDhjEpZDwjyK0 | ||
26 | +gJUWilI8DYTvMa/fdpuVtc5qJErwfNmhRIWiWWryE1OrD1dprQYZzeAy/0+5HDrb | ||
27 | +lhQhMGXOJbhiQdKPMcwGbw== | ||
28 | +-----END PRIVATE KEY----- |
@@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
1 | +D4E715D41B6F9424 |
@@ -0,0 +1,357 @@ | @@ -0,0 +1,357 @@ | ||
1 | +# | ||
2 | +# OpenSSL example configuration file. | ||
3 | +# This is mostly being used for generation of certificate requests. | ||
4 | +# | ||
5 | + | ||
6 | +# Note that you can include other files from the main configuration | ||
7 | +# file using the .include directive. | ||
8 | +#.include filename | ||
9 | + | ||
10 | +# This definition stops the following lines choking if HOME isn't | ||
11 | +# defined. | ||
12 | +HOME = . | ||
13 | +RANDFILE = $ENV::HOME/.rnd | ||
14 | + | ||
15 | +# Extra OBJECT IDENTIFIER info: | ||
16 | +#oid_file = $ENV::HOME/.oid | ||
17 | +oid_section = new_oids | ||
18 | + | ||
19 | +# To use this configuration file with the "-extfile" option of the | ||
20 | +# "openssl x509" utility, name here the section containing the | ||
21 | +# X.509v3 extensions to use: | ||
22 | +# extensions = | ||
23 | +# (Alternatively, use a configuration file that has only | ||
24 | +# X.509v3 extensions in its main [= default] section.) | ||
25 | + | ||
26 | +[ new_oids ] | ||
27 | + | ||
28 | +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. | ||
29 | +# Add a simple OID like this: | ||
30 | +# testoid1=1.2.3.4 | ||
31 | +# Or use config file substitution like this: | ||
32 | +# testoid2=${testoid1}.5.6 | ||
33 | + | ||
34 | +# Policies used by the TSA examples. | ||
35 | +tsa_policy1 = 1.2.3.4.1 | ||
36 | +tsa_policy2 = 1.2.3.4.5.6 | ||
37 | +tsa_policy3 = 1.2.3.4.5.7 | ||
38 | + | ||
39 | +#################################################################### | ||
40 | +[ ca ] | ||
41 | +default_ca = CA_default # The default ca section | ||
42 | + | ||
43 | +#################################################################### | ||
44 | +[ CA_default ] | ||
45 | + | ||
46 | +dir = ./demoCA # Where everything is kept | ||
47 | +certs = $dir/certs # Where the issued certs are kept | ||
48 | +crl_dir = $dir/crl # Where the issued crl are kept | ||
49 | +database = $dir/index.txt # database index file. | ||
50 | +#unique_subject = no # Set to 'no' to allow creation of | ||
51 | + # several certs with same subject. | ||
52 | +new_certs_dir = $dir/newcerts # default place for new certs. | ||
53 | + | ||
54 | +certificate = $dir/cacert.pem # The CA certificate | ||
55 | +serial = $dir/serial # The current serial number | ||
56 | +crlnumber = $dir/crlnumber # the current crl number | ||
57 | + # must be commented out to leave a V1 CRL | ||
58 | +crl = $dir/crl.pem # The current CRL | ||
59 | +private_key = $dir/private/cakey.pem# The private key | ||
60 | +RANDFILE = $dir/private/.rand # private random number file | ||
61 | + | ||
62 | +x509_extensions = usr_cert # The extensions to add to the cert | ||
63 | + | ||
64 | +# Comment out the following two lines for the "traditional" | ||
65 | +# (and highly broken) format. | ||
66 | +name_opt = ca_default # Subject Name options | ||
67 | +cert_opt = ca_default # Certificate field options | ||
68 | + | ||
69 | +# Extension copying option: use with caution. | ||
70 | +copy_extensions = copy | ||
71 | + | ||
72 | +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs | ||
73 | +# so this is commented out by default to leave a V1 CRL. | ||
74 | +# crlnumber must also be commented out to leave a V1 CRL. | ||
75 | +# crl_extensions = crl_ext | ||
76 | + | ||
77 | +default_days = 365 # how long to certify for | ||
78 | +default_crl_days= 30 # how long before next CRL | ||
79 | +default_md = default # use public key default MD | ||
80 | +preserve = no # keep passed DN ordering | ||
81 | + | ||
82 | +# A few difference way of specifying how similar the request should look | ||
83 | +# For type CA, the listed attributes must be the same, and the optional | ||
84 | +# and supplied fields are just that :-) | ||
85 | +policy = policy_match | ||
86 | + | ||
87 | +# For the CA policy | ||
88 | +[ policy_match ] | ||
89 | +countryName = match | ||
90 | +stateOrProvinceName = match | ||
91 | +organizationName = match | ||
92 | +organizationalUnitName = optional | ||
93 | +commonName = supplied | ||
94 | +emailAddress = optional | ||
95 | + | ||
96 | +# For the 'anything' policy | ||
97 | +# At this point in time, you must list all acceptable 'object' | ||
98 | +# types. | ||
99 | +[ policy_anything ] | ||
100 | +countryName = optional | ||
101 | +stateOrProvinceName = optional | ||
102 | +localityName = optional | ||
103 | +organizationName = optional | ||
104 | +organizationalUnitName = optional | ||
105 | +commonName = supplied | ||
106 | +emailAddress = optional | ||
107 | + | ||
108 | +#################################################################### | ||
109 | +[ req ] | ||
110 | +default_bits = 2048 | ||
111 | +default_keyfile = privkey.pem | ||
112 | +distinguished_name = req_distinguished_name | ||
113 | +attributes = req_attributes | ||
114 | +x509_extensions = v3_ca # The extensions to add to the self signed cert | ||
115 | + | ||
116 | +# Passwords for private keys if not present they will be prompted for | ||
117 | +# input_password = secret | ||
118 | +# output_password = secret | ||
119 | + | ||
120 | +# This sets a mask for permitted string types. There are several options. | ||
121 | +# default: PrintableString, T61String, BMPString. | ||
122 | +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) | ||
123 | +# utf8only: only UTF8Strings (PKIX recommendation after 2004). | ||
124 | +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). | ||
125 | +# MASK:XXXX a literal mask value. | ||
126 | +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. | ||
127 | +string_mask = utf8only | ||
128 | + | ||
129 | +req_extensions = v3_req # The extensions to add to a certificate request | ||
130 | + | ||
131 | +[ req_distinguished_name ] | ||
132 | +countryName = Country Name (2 letter code) | ||
133 | +countryName_default = AU | ||
134 | +countryName_min = 2 | ||
135 | +countryName_max = 2 | ||
136 | + | ||
137 | +stateOrProvinceName = State or Province Name (full name) | ||
138 | +stateOrProvinceName_default = Some-State | ||
139 | + | ||
140 | +localityName = Locality Name (eg, city) | ||
141 | + | ||
142 | +0.organizationName = Organization Name (eg, company) | ||
143 | +0.organizationName_default = Internet Widgits Pty Ltd | ||
144 | + | ||
145 | +# we can do this but it is not needed normally :-) | ||
146 | +#1.organizationName = Second Organization Name (eg, company) | ||
147 | +#1.organizationName_default = World Wide Web Pty Ltd | ||
148 | + | ||
149 | +organizationalUnitName = Organizational Unit Name (eg, section) | ||
150 | +#organizationalUnitName_default = | ||
151 | + | ||
152 | +commonName = Common Name (e.g. server FQDN or YOUR name) | ||
153 | +commonName_max = 64 | ||
154 | + | ||
155 | +emailAddress = Email Address | ||
156 | +emailAddress_max = 64 | ||
157 | + | ||
158 | +# SET-ex3 = SET extension number 3 | ||
159 | + | ||
160 | +[ req_attributes ] | ||
161 | +challengePassword = A challenge password | ||
162 | +challengePassword_min = 4 | ||
163 | +challengePassword_max = 20 | ||
164 | + | ||
165 | +unstructuredName = An optional company name | ||
166 | + | ||
167 | +[ usr_cert ] | ||
168 | + | ||
169 | +# These extensions are added when 'ca' signs a request. | ||
170 | + | ||
171 | +# This goes against PKIX guidelines but some CAs do it and some software | ||
172 | +# requires this to avoid interpreting an end user certificate as a CA. | ||
173 | + | ||
174 | +basicConstraints=CA:FALSE | ||
175 | + | ||
176 | +# Here are some examples of the usage of nsCertType. If it is omitted | ||
177 | +# the certificate can be used for anything *except* object signing. | ||
178 | + | ||
179 | +# This is OK for an SSL server. | ||
180 | +# nsCertType = server | ||
181 | + | ||
182 | +# For an object signing certificate this would be used. | ||
183 | +# nsCertType = objsign | ||
184 | + | ||
185 | +# For normal client use this is typical | ||
186 | +# nsCertType = client, email | ||
187 | + | ||
188 | +# and for everything including object signing: | ||
189 | +# nsCertType = client, email, objsign | ||
190 | + | ||
191 | +# This is typical in keyUsage for a client certificate. | ||
192 | +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment | ||
193 | + | ||
194 | +# This will be displayed in Netscape's comment listbox. | ||
195 | +nsComment = "OpenSSL Generated Certificate" | ||
196 | + | ||
197 | +# PKIX recommendations harmless if included in all certificates. | ||
198 | +subjectKeyIdentifier=hash | ||
199 | +authorityKeyIdentifier=keyid,issuer | ||
200 | + | ||
201 | +# This stuff is for subjectAltName and issuerAltname. | ||
202 | +# Import the email address. | ||
203 | +# subjectAltName=email:copy | ||
204 | +# An alternative to produce certificates that aren't | ||
205 | +# deprecated according to PKIX. | ||
206 | +# subjectAltName=email:move | ||
207 | + | ||
208 | +# Copy subject details | ||
209 | +# issuerAltName=issuer:copy | ||
210 | + | ||
211 | +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem | ||
212 | +#nsBaseUrl | ||
213 | +#nsRevocationUrl | ||
214 | +#nsRenewalUrl | ||
215 | +#nsCaPolicyUrl | ||
216 | +#nsSslServerName | ||
217 | + | ||
218 | +# This is required for TSA certificates. | ||
219 | +# extendedKeyUsage = critical,timeStamping | ||
220 | + | ||
221 | +[ v3_req ] | ||
222 | + | ||
223 | +# Extensions to add to a certificate request | ||
224 | + | ||
225 | +basicConstraints = CA:FALSE | ||
226 | +keyUsage = nonRepudiation, digitalSignature, keyEncipherment | ||
227 | +subjectAltName = @alt_names | ||
228 | + | ||
229 | +[alt_names] | ||
230 | +DNS.1 = localhost | ||
231 | +DNS.1 = pro2d | ||
232 | + | ||
233 | +[ v3_ca ] | ||
234 | + | ||
235 | + | ||
236 | +# Extensions for a typical CA | ||
237 | + | ||
238 | + | ||
239 | +# PKIX recommendation. | ||
240 | + | ||
241 | +subjectKeyIdentifier=hash | ||
242 | + | ||
243 | +authorityKeyIdentifier=keyid:always,issuer | ||
244 | + | ||
245 | +basicConstraints = critical,CA:true | ||
246 | + | ||
247 | +# Key usage: this is typical for a CA certificate. However since it will | ||
248 | +# prevent it being used as an test self-signed certificate it is best | ||
249 | +# left out by default. | ||
250 | +# keyUsage = cRLSign, keyCertSign | ||
251 | + | ||
252 | +# Some might want this also | ||
253 | +# nsCertType = sslCA, emailCA | ||
254 | + | ||
255 | +# Include email address in subject alt name: another PKIX recommendation | ||
256 | +# subjectAltName=email:copy | ||
257 | +# Copy issuer details | ||
258 | +# issuerAltName=issuer:copy | ||
259 | + | ||
260 | +# DER hex encoding of an extension: beware experts only! | ||
261 | +# obj=DER:02:03 | ||
262 | +# Where 'obj' is a standard or added object | ||
263 | +# You can even override a supported extension: | ||
264 | +# basicConstraints= critical, DER:30:03:01:01:FF | ||
265 | + | ||
266 | +[ crl_ext ] | ||
267 | + | ||
268 | +# CRL extensions. | ||
269 | +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. | ||
270 | + | ||
271 | +# issuerAltName=issuer:copy | ||
272 | +authorityKeyIdentifier=keyid:always | ||
273 | + | ||
274 | +[ proxy_cert_ext ] | ||
275 | +# These extensions should be added when creating a proxy certificate | ||
276 | + | ||
277 | +# This goes against PKIX guidelines but some CAs do it and some software | ||
278 | +# requires this to avoid interpreting an end user certificate as a CA. | ||
279 | + | ||
280 | +basicConstraints=CA:FALSE | ||
281 | + | ||
282 | +# Here are some examples of the usage of nsCertType. If it is omitted | ||
283 | +# the certificate can be used for anything *except* object signing. | ||
284 | + | ||
285 | +# This is OK for an SSL server. | ||
286 | +# nsCertType = server | ||
287 | + | ||
288 | +# For an object signing certificate this would be used. | ||
289 | +# nsCertType = objsign | ||
290 | + | ||
291 | +# For normal client use this is typical | ||
292 | +# nsCertType = client, email | ||
293 | + | ||
294 | +# and for everything including object signing: | ||
295 | +# nsCertType = client, email, objsign | ||
296 | + | ||
297 | +# This is typical in keyUsage for a client certificate. | ||
298 | +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment | ||
299 | + | ||
300 | +# This will be displayed in Netscape's comment listbox. | ||
301 | +nsComment = "OpenSSL Generated Certificate" | ||
302 | + | ||
303 | +# PKIX recommendations harmless if included in all certificates. | ||
304 | +subjectKeyIdentifier=hash | ||
305 | +authorityKeyIdentifier=keyid,issuer | ||
306 | + | ||
307 | +# This stuff is for subjectAltName and issuerAltname. | ||
308 | +# Import the email address. | ||
309 | +# subjectAltName=email:copy | ||
310 | +# An alternative to produce certificates that aren't | ||
311 | +# deprecated according to PKIX. | ||
312 | +# subjectAltName=email:move | ||
313 | + | ||
314 | +# Copy subject details | ||
315 | +# issuerAltName=issuer:copy | ||
316 | + | ||
317 | +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem | ||
318 | +#nsBaseUrl | ||
319 | +#nsRevocationUrl | ||
320 | +#nsRenewalUrl | ||
321 | +#nsCaPolicyUrl | ||
322 | +#nsSslServerName | ||
323 | + | ||
324 | +# This really needs to be in place for it to be a proxy certificate. | ||
325 | +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo | ||
326 | + | ||
327 | +#################################################################### | ||
328 | +[ tsa ] | ||
329 | + | ||
330 | +default_tsa = tsa_config1 # the default TSA section | ||
331 | + | ||
332 | +[ tsa_config1 ] | ||
333 | + | ||
334 | +# These are used by the TSA reply generation only. | ||
335 | +dir = ./demoCA # TSA root directory | ||
336 | +serial = $dir/tsaserial # The current serial number (mandatory) | ||
337 | +crypto_device = builtin # OpenSSL engine to use for signing | ||
338 | +signer_cert = $dir/tsacert.pem # The TSA signing certificate | ||
339 | + # (optional) | ||
340 | +certs = $dir/cacert.pem # Certificate chain to include in reply | ||
341 | + # (optional) | ||
342 | +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) | ||
343 | +signer_digest = sha256 # Signing digest to use. (Optional) | ||
344 | +default_policy = tsa_policy1 # Policy if request did not specify it | ||
345 | + # (optional) | ||
346 | +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) | ||
347 | +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) | ||
348 | +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) | ||
349 | +clock_precision_digits = 0 # number of digits after dot. (optional) | ||
350 | +ordering = yes # Is ordering defined for timestamps? | ||
351 | + # (optional, default: no) | ||
352 | +tsa_name = yes # Must the TSA name be included in the reply? | ||
353 | + # (optional, default: no) | ||
354 | +ess_cert_id_chain = no # Must the ESS cert id chain be included? | ||
355 | + # (optional, default: no) | ||
356 | +ess_cert_id_alg = sha1 # algorithm to compute certificate | ||
357 | + # identifier (optional, default: sha1) |
@@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
1 | +-----BEGIN CERTIFICATE REQUEST----- | ||
2 | +MIICzjCCAbYCAQAwTjELMAkGA1UEBhMCQ04xCzAJBgNVBAsMAklUMQ8wDQYDVQQK | ||
3 | +DAZHbG9iYWwxDjAMBgNVBAMMBXBybzJkMREwDwYDVQQHDAhaaGVKaWFuZzCCASIw | ||
4 | +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANd6QZzSWnpQN74TzcN8WoUYwutx | ||
5 | +mSQB2x8h17VBlVJepFpog1ujWoZUl1xQ7lgPr2DhMHM1qNkroahdI/AZGj2juuC2 | ||
6 | +1vg2WZ4Wa/8vsICGPvTTqEd7VSpY66ybk0kd7rWFp7naXLBGFVf7mi3RPDW9Y3mO | ||
7 | +cyTR7Iwtm1iBhMDS5uczUOzrZ63yd0FA62iizKqckfwXVsYFUJqdG0uUUt88whnt | ||
8 | +qAPRKrkuU+Y6I+jo+C6gf7i7RTLz6aI01QYLRMENmJI5NqFcJ4cNKWsLIWY3sDz0 | ||
9 | +XoyueWl3tHrjiX4TmZM28OZAHl/rKd0lQpQEB0UiHe7At/8xZHLDol6ip4MCAwEA | ||
10 | +AaA7MDkGCSqGSIb3DQEJDjEsMCowCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwEAYD | ||
11 | +VR0RBAkwB4IFcHJvMmQwDQYJKoZIhvcNAQELBQADggEBAKytMdGU/yLmC5uUUdWd | ||
12 | +0dnqloVaCiyPCjWBsv44H2jiVq2UT5nQeiTWJ2hAt6RIsIUyymrY6Flg6ZpCfKaa | ||
13 | +yqYNDBzDwGAJAWTHicNyQT/Uxb5rn+6R4qfyBOkFGaPlF9dxCgKRTqaSX5WmWFE6 | ||
14 | +FzsAiwYcc8fb+ioljnN3NJ7MZLz0n6RU52PCwYDbgC941t3yFa5R1wHgGoK1/93B | ||
15 | +2/+IUNWaS8XRGfRe3SUZ2rSTuCgr8J9jfsvsx3qga3KWTpyAxOe3vexKpnhO9Xw0 | ||
16 | +wDVRApMMmlPVrLrKMNGSCXNaBT0JdTpFn9CJFheJs9jqv+q77T8qpqln9leMgtvF | ||
17 | +ql8= | ||
18 | +-----END CERTIFICATE REQUEST----- |
@@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
1 | +-----BEGIN PRIVATE KEY----- | ||
2 | +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDXekGc0lp6UDe+ | ||
3 | +E83DfFqFGMLrcZkkAdsfIde1QZVSXqRaaINbo1qGVJdcUO5YD69g4TBzNajZK6Go | ||
4 | +XSPwGRo9o7rgttb4NlmeFmv/L7CAhj7006hHe1UqWOusm5NJHe61hae52lywRhVX | ||
5 | ++5ot0Tw1vWN5jnMk0eyMLZtYgYTA0ubnM1Ds62et8ndBQOtoosyqnJH8F1bGBVCa | ||
6 | +nRtLlFLfPMIZ7agD0Sq5LlPmOiPo6PguoH+4u0Uy8+miNNUGC0TBDZiSOTahXCeH | ||
7 | +DSlrCyFmN7A89F6Mrnlpd7R644l+E5mTNvDmQB5f6yndJUKUBAdFIh3uwLf/MWRy | ||
8 | +w6JeoqeDAgMBAAECggEAecQ5zdBFlvc7+OsiDUV5tdsfU4PXgbSWykoKpwBPzMN0 | ||
9 | +5y5GhQOUBXNKMb3+Yr9CYWIASirZpxfz+7vesjDNVmXvFkvcwVmdXSvYjdW6TXcP | ||
10 | +nrT5VKPKpeqoC9vC6L/EhMnp1aojVO3V4+ln4FpsRwYmb6vjP7xti22+as6OYZQC | ||
11 | +ygC0f0hCWO4t67BrH7lmA+l5KHmfQtl0t7iJ3yXLXz1EMtbVKwoOuNxBnfxTdPuE | ||
12 | +a2ke5G8S8nN5ZCe2FpaN+BxQQ4NpRnc0aK5O02EibA5Ix2ItLnXs+MluNC91veVS | ||
13 | +WRAbEbvFBwZx624u0NEe5oAIFhS2m4VeKVUmqfdxwQKBgQD/fuE13vXtSV30I4Sj | ||
14 | +lZJfr9r+T/gGA6wIna0RhfaXnKDS9SjzFgF6MS2QSRKYzjPCzfGQIxq368NLrEdu | ||
15 | +lCLNQF9Z06lVNeuJT84VPYm4P/wheIG7LhNmBHsnkTzYnupFrlB22TnmStDSfuGp | ||
16 | +dhlyAUGN91pg/mP/nO1ZrTPpowKBgQDX5ycPD8dOUz2ACoKCGEf37hbcfqBmKd7a | ||
17 | +JGYOWaBXPOGZ26KboWoClrStHow2VCnqEx9pewA6+4m0cv4JXiCXa1/uoY9XxHRI | ||
18 | +Tz3BSycqAOFTGhz9Z+Nq8Rc9PIFYBHzjyVgrsXiO86TKK33uE7GAqXZGB+MeDOf0 | ||
19 | +FSb8a8vooQKBgDkR715oKkjRnZH+KQ+dRm/nSSSLWlyFj3TxO4pxgQ6GpwnYR0hd | ||
20 | +PwE7YPEc0XGehcNa2z2WCc7Rc/NATUhvAIMWgPYAqI9nFvC6Cc+Gym+Eo14am+fi | ||
21 | +t+SO1a+V6qB8htn/wOt7REqjpZePTfrbbX2guDLs8Jw/1rhvJjlkzfa/AoGBAJ+/ | ||
22 | +RbQsPZDjoE6b+CKgKqf0v2+YNcBB3MVVRzn48N17i4VW8ILstM6Did3KC36rWXP7 | ||
23 | +gDOAshPyR9p/dx2hSsYeyZV8bt5G2q8iCpR5sdmvWwks+iQ5eRiImGRT33Qrpei4 | ||
24 | +8ocpwgUrm1OHSJ8ebSjAumVospBqhjmgaP8+F1rhAoGBAIaDv/yhFtEQaldOkK8X | ||
25 | +YQACUmt3YflHxWmdlmulVqAOCDH8nV3YYHGFIEatBx2w0OBvxoLtw5HTvEq1pFcF | ||
26 | +4cL8ulNQeozLTsGfNeLgIe7NOb6T54QZFVg1+dgePtBIsab59sZE3817j5zmkr0A | ||
27 | +DywcIXZFRNuOpQgL2I4JF7PX | ||
28 | +-----END PRIVATE KEY----- |
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +-----BEGIN CERTIFICATE----- | ||
2 | +MIIDgzCCAmugAwIBAgIJANTnFdQbb5QkMA0GCSqGSIb3DQEBBQUAMIGFMQswCQYD | ||
3 | +VQQGEwJDTjERMA8GA1UECAwIWmhlSmlhbmcxETAPBgNVBAcMCFpoZUppYW5nMQ8w | ||
4 | +DQYDVQQKDAZHbG9iYWwxFzAVBgNVBAMMDnBybzJkIFNlY3VyaXR5MRYwFAYDVQQL | ||
5 | +DA1JVCBEZXBhcnRtZW50MQ4wDAYDVQQDDAVwcm8yZDAeFw0yMjAyMjIwNjA3MjNa | ||
6 | +Fw0yMzAyMjIwNjA3MjNaME4xCzAJBgNVBAYTAkNOMQswCQYDVQQLDAJJVDEPMA0G | ||
7 | +A1UECgwGR2xvYmFsMQ4wDAYDVQQDDAVwcm8yZDERMA8GA1UEBwwIWmhlSmlhbmcw | ||
8 | +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDXekGc0lp6UDe+E83DfFqF | ||
9 | +GMLrcZkkAdsfIde1QZVSXqRaaINbo1qGVJdcUO5YD69g4TBzNajZK6GoXSPwGRo9 | ||
10 | +o7rgttb4NlmeFmv/L7CAhj7006hHe1UqWOusm5NJHe61hae52lywRhVX+5ot0Tw1 | ||
11 | +vWN5jnMk0eyMLZtYgYTA0ubnM1Ds62et8ndBQOtoosyqnJH8F1bGBVCanRtLlFLf | ||
12 | +PMIZ7agD0Sq5LlPmOiPo6PguoH+4u0Uy8+miNNUGC0TBDZiSOTahXCeHDSlrCyFm | ||
13 | +N7A89F6Mrnlpd7R644l+E5mTNvDmQB5f6yndJUKUBAdFIh3uwLf/MWRyw6JeoqeD | ||
14 | +AgMBAAGjLDAqMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMBAGA1UdEQQJMAeCBXBy | ||
15 | +bzJkMA0GCSqGSIb3DQEBBQUAA4IBAQBmCfF8okV2lCH7KBA4gKjKh7dCKdLiTBWP | ||
16 | +q5qHNt2dYOmZAi3CFlgvAqgg30/Ql9pILN+0XJTL7TnJRhvvCZ/eObtCJbmZD/jP | ||
17 | +SzmowtCyydPtj/DGmxY+UQZk4KqtRuDGD5LQRU2VYzHJvrf9yEse2uIf+uUetx7b | ||
18 | +r2dklvP+H33rMB1k3hswHg2/EmhJxtfvQCLQX8+Ofur/wW8uYKFj3hTabzYfcew3 | ||
19 | +Uw1/5a+rLHBLAA1SYoviwnoNgiVBxkWkfEH7tsheFapVULltz3vll013Q69RBXVw | ||
20 | +K7QloFM0LgoJKM+X65ymUGPGL3F4WvewSOiWyFLQdW43wRlUUNkq | ||
21 | +-----END CERTIFICATE----- |
test/client.go
@@ -6,6 +6,7 @@ import ( | @@ -6,6 +6,7 @@ import ( | ||
6 | "context" | 6 | "context" |
7 | "fmt" | 7 | "fmt" |
8 | "google.golang.org/grpc" | 8 | "google.golang.org/grpc" |
9 | + "google.golang.org/grpc/credentials" | ||
9 | _ "pro2d/conf" | 10 | _ "pro2d/conf" |
10 | "pro2d/protos/pb" | 11 | "pro2d/protos/pb" |
11 | "pro2d/utils" | 12 | "pro2d/utils" |
@@ -31,7 +32,20 @@ func Register(c pb.LoginClient, phone, password string) error { | @@ -31,7 +32,20 @@ func Register(c pb.LoginClient, phone, password string) error { | ||
31 | func Login(loginUri, token, uid string) { | 32 | func Login(loginUri, token, uid string) { |
32 | var opts []grpc.DialOption | 33 | var opts []grpc.DialOption |
33 | // 指定自定义认证 | 34 | // 指定自定义认证 |
34 | - opts = append(opts, grpc.WithPerRPCCredentials(&utils.AuthToken{Token: token}), grpc.WithInsecure()) | 35 | + opts = append(opts, grpc.WithPerRPCCredentials(&utils.AuthToken{Token: token})) |
36 | + if TLS { | ||
37 | + // TLS连接 | ||
38 | + creds, err := credentials.NewClientTLSFromFile("keys/server.pem", ServerName) | ||
39 | + if err != nil { | ||
40 | + utils.Sugar.Fatalf("Failed to create TLS credentials %v", err) | ||
41 | + return | ||
42 | + } | ||
43 | + opts = append(opts, grpc.WithTransportCredentials(creds)) | ||
44 | + | ||
45 | + }else{ | ||
46 | + opts = append(opts, grpc.WithInsecure()) | ||
47 | + } | ||
48 | + | ||
35 | gameConn, err := grpc.Dial(loginUri, opts...) | 49 | gameConn, err := grpc.Dial(loginUri, opts...) |
36 | if err != nil { | 50 | if err != nil { |
37 | utils.Sugar.Errorf("game conn err: %v", err) | 51 | utils.Sugar.Errorf("game conn err: %v", err) |
@@ -66,15 +80,35 @@ func Login(loginUri, token, uid string) { | @@ -66,15 +80,35 @@ func Login(loginUri, token, uid string) { | ||
66 | utils.Sugar.Debugf("login successful role: %v", role) | 80 | utils.Sugar.Debugf("login successful role: %v", role) |
67 | } | 81 | } |
68 | 82 | ||
83 | +const ( | ||
84 | + TLS = true | ||
85 | + ServerName = "pro2d" | ||
86 | +) | ||
87 | + | ||
69 | func main() { | 88 | func main() { |
70 | - conn, err := grpc.Dial("localhost:8848", grpc.WithInsecure()) | 89 | + |
90 | + var opts []grpc.DialOption | ||
91 | + if TLS { | ||
92 | + // TLS连接 | ||
93 | + creds, err := credentials.NewClientTLSFromFile("keys/server.pem", ServerName) | ||
94 | + if err != nil { | ||
95 | + utils.Sugar.Fatalf("Failed to create TLS credentials %v", err) | ||
96 | + return | ||
97 | + } | ||
98 | + opts = append(opts, grpc.WithTransportCredentials(creds)) | ||
99 | + | ||
100 | + }else{ | ||
101 | + opts = append(opts, grpc.WithInsecure()) | ||
102 | + } | ||
103 | + | ||
104 | + conn, err := grpc.Dial("localhost:8848", opts...) | ||
71 | if err != nil { | 105 | if err != nil { |
72 | utils.Sugar.Errorf("conn err: %v", err) | 106 | utils.Sugar.Errorf("conn err: %v", err) |
73 | return | 107 | return |
74 | } | 108 | } |
75 | defer conn.Close() | 109 | defer conn.Close() |
76 | c := pb.NewLoginClient(conn) | 110 | c := pb.NewLoginClient(conn) |
77 | - err = Register(c,"17683852936", "123456") | 111 | + //err = Register(c,"17683852936", "123456") |
78 | //if err != nil { | 112 | //if err != nil { |
79 | // utils.Sugar.Errorf("register err: %v", err) | 113 | // utils.Sugar.Errorf("register err: %v", err) |
80 | // return | 114 | // return |
@@ -97,4 +131,4 @@ func main() { | @@ -97,4 +131,4 @@ func main() { | ||
97 | if len(rsp.GameService) >0 { | 131 | if len(rsp.GameService) >0 { |
98 | Login(rsp.GameService[0].Address, rsp.Token, rsp.Uid) | 132 | Login(rsp.GameService[0].Address, rsp.Token, rsp.Uid) |
99 | } | 133 | } |
100 | -} | 134 | -} |
135 | +} | ||
101 | \ No newline at end of file | 136 | \ No newline at end of file |