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 |