栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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, ALTS ,Token-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证书)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1005653.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号