文章目录
- 1.首先通过openssl生成证书和私钥
- 2.配置环境变量
- 3.命令行测试 openssl
- 4. 生成证书
- 5. 更改openssl.cfg
- 6.
- 7.服务端代码
- 8.客户端代码
1.首先通过openssl生成证书和私钥
https://slproweb.com/products/Win32OpenSSL.html
2.配置环境变量
3.命令行测试 openssl
4. 生成证书
1. 生成私钥
openssl genrsa -out server.key 2048
2.生成证书 全部回车即可,可以不填
openssl req -new -x509 -key server.key -out server.crt -days 36500
3.生成 csr
openssl req -new -key server.key -out server.csr
会在你的目录下生成三个文件
5. 更改openssl.cfg
1. 复制一份你安装的openssl的bin目录里的openssl.cfg文件到你项目所在的目录
2. 找到 [ CA_default ] 打开copy_extensions = copy
3. 找到 [ req ] 打开 req_extensions = v3_req
4. 找到 [ v3_req ] 添加 subjectAltName = @alt_names
5. 添加新的标签和标签字段 DNS.1 = *.krien.com
6.
1. 生成证书私钥test.key
openssl genpkey -algorithm RSA -out test.key
2.通过私钥test.key生成证书请求文件test.csr
openssl req -new -nodes -key test.key -out test.csr -days 3650 -subj "/C=cn/OU=myorg/O=mycomp/CN=myname" -config ./openssl.cfg -extensions v3_req
3.生成SAN证书 pem
openssl x509 -req -days 365 -in test.csr -out test.pem -CA server.crt -CAkey server.key -CAcreateserial -extfile ./openssl.cfg -extensions v3_req
7.服务端代码
类型定义:NewServerTLSFromFile里面有两个参数。certFile和keyFile,certFile就是我们生成的pem后缀的证书文件,第二个是私钥,储存在服务器端,非常安全。
func NewServerTLSFromFile(certFile, keyFile string) (TransportCredentials, error)
创建的时候再把 creds 丢到 grpcServer := grpc.NewServer(grpc.Creds(creds)) 就行了,服务器端就修改好了
完整代码如下:
package main
import (
"context"
"fmt"
pb "gRPC_test/hello-server/proto"
"net"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
type server struct {
pb.UnimplementedSayHelloServer
}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequests) (*pb.HelloResponse, error) {
return &pb.HelloResponse{ResponseMsg: "hello" + req.RequestName}, nil
}
func main() {
// TSL认证
// 证书签名文件和私钥文件
creds, _ := credentials.NewServerTLSFromFile("C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.pem", "C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.key")
// 开启端口
listen, _ := net.Listen("tcp", ":9090")
// 创建gRPC服务
grpcServer := grpc.NewServer(grpc.Creds(creds))
// 在gRPC服务端中去注册我们编写的服务
pb.RegisterSayHelloServer(grpcServer, &server{})
// 启动服务
err := grpcServer.Serve(listen)
if err != nil {
fmt.Printf("failed to serve :%v ", err)
return
}
}
8.客户端代码
首先需要在 credentials.NewClientTLSFromFile() 方法里放入两个参数,分别是pem证书文件,和请求域,请求域名和 openssl.cfg 文件里配置的域名一致,不然会报错(真实情景中请求域是从浏览器中获取的)
credentials.NewClientTLSFromFile("C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.pem", "*.krien.com")
完整代码如下:
package main
import (
"context"
"fmt"
"log"
pb "gRPC/hello-server/proto"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
func main() {
creds, _ := credentials.NewClientTLSFromFile("C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.pem", "*.kangstudy.com")
conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithTransportCredentials(creds))
if err != nil {
log.Fatalf("did not connect:%v", err)
}
// 所有的连接用完都要关闭连接
defer conn.Close()
// 建立连接
client := pb.NewSayHelloClient(conn)
// 执行rpc调用(这个方法在服务器端来实现并返回结果)
resp, _ := client.SayHello(context.Background(), &pb.HelloRequests{RequestName: "krien"})
fmt.Println(resp.ResponseMsg)
}