【Golang | gRPC】使用TLS/SSL认证的gRPC服务

环境:
Golang: go1.18.2 windows/amd64
grpc: v1.47.0
protobuf: v1.28.0
OpenSSL: 3.0.4

完整代码:
https://github.com/WanshanTian/GolangLearning
cd GolangLearning/RPC/gRPC-cred

1. 简介

gRPC支持很多认证机制,如:SSL/TLS ALTSToken-based authentication with Google,同时支持以插件的方式使用自定义的认证机制。
本文主要介绍TLS/SSL认证机制的使用

2. 实践

【Golang | gRPC】使用gRPC实现简单远程调用 实现了无认证的gRPC服务,在此基础上添加服务端的单向认证

2.1 生成私钥和证书

关于证书的制作可以参考【Golang | gRPC】使用openssl生成证书

2.1.1 创建RSA私钥

# 生成2048位的RSA私钥
openssl genrsa -out server.key 2048

2.1.2 创建证书请求文件csr

# 创建证书请求文件csr
openssl req -new -key server.key -out server.csr -subj "/CN=shannont.com"

2.1.3 创建SAN证书

1). 首先新建文件server.ext,文件中保存如下内容:

subjectAltName = DNS:*.shannont.com, DNS:shannont.com, DNS:localhost

注:

  • 这里添加localhost的目的是方便本地调试(创建socket监听器时,net.Listen("tcp", ":1234")对应的主机名就是localhost

2). 通过添加选项-extfile创建SAN证书

openssl x509 -req -in server.csr -days 365 -key server.key -out server.crt -extfile server.ext

2.2 服务端

   // 读取证书和私钥,构建TLS credentials
	creds, err := credentials.NewServerTLSFromFile("../cert/server.crt", "../cert/server.key")
	if err != nil {
		log.Panic(err)
	}
	// new一个gRPC服务器,用来注册服务
	grpcserver := grpc.NewServer(grpc.Creds(creds))

2.3 客户端

    // 读取证书,构建TLS credentials
	creds, err := credentials.NewClientTLSFromFile("../cert/server.crt", "")
	if err != nil {
		log.Panic(err)
	}
	conn, err := grpc.Dial(":1234", grpc.WithTransportCredentials(creds))
	if err != nil {
		log.Panic(err)
	}

3. 踩坑

  1. 问题1:
    transport: authentication handshake failed: x509: certificate is not valid for any names, but wanted to match localhost
    原因:
    是由于服务端用的主机名是localhost(对应服务端中的net.Listen("tcp", ":1234")),而证书里没有对应的主机名
    在这里插入图片描述

  2. 问题2:
    如果在CN(Common Name)里填入localhost,会报如下错:
    transport: authentication handshake failed: x509: certificate relies on legacy Common Name field, use SANs instead
    原因:当前gRPC版本的主机名不依赖CN字段,而是要使用SAN

解决方法:
问题1和问题2均通过参考2.1.3小节创建SAN证书解决,SAN证书中查看localhost主机名
在这里插入图片描述

4. 总结

  • 当使用gRPC的TLS/SSL认证机制时,证书是多主机证书(SAN证书)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值