gRPC 服务使用 TLS 加密
gRPC 支持使用 TLS 对请求进行加密
SSL(Secure Socket Layer,安全套接字),是面向连接的网络层和应用层协议之间的一种协议层;SSL 通过互相认证、使用数字签名确保完整性、使用加密确保隐私性,以实现客户端和服务端之间的安全通讯
TLS(Transport Layer Security, 传输层安全协议),用于两个应用程序之间提供保密性和数据完整性
SSL是基于 HTTP 之下 TCP 之上的一个协议层,在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制(但是几乎和SSL3.0无差异),标准化后的IETF更名为TLS1.0(Transport Layer Security 安全传输层协议),可以说TLS就是SSL的新版本3.1
相关项目参考 github.com/helloworlde/grpc-java-sample
生成证书
可以通过 openssl 生成一个自签名的证书,用于加密
- 添加配置
指定证书的配置,其中 CN 指定了访问的域名,如果实际域名与证书域名不一致,会导致连接失败
- certificate.conf
1 | [req] |
- 生成证书
生成自签名的证书,因为 Netty 的 SslContextBuilder 和 SslContext 仅支持 PKCS8 格式的 key,所以需要将其他格式的 key 转换为 PKCS8 格式
1 | openssl genrsa -out ca.key 4096 |
执行命名后,会生成多个文件,其中 Server 端需要私钥 server.key 以及证书 server.pem,客户端需要证书 server.pem
Server 端
- 配置 SSL
1 | @Slf4j |
Client 端
- 配置 SSL
为 Channel 指定了 SSL 上下文配置,并且覆盖了 authority,要和证书中的配置一致,用于建立连接时校验
1 | @Slf4j |
测试
调整日志级别
1
2
3
4
5
6
7
8
9
10setLogger("io.grpc");
private static void setLogger(String className) {
Logger logger = Logger.getLogger(className);
logger.setLevel(Level.ALL);
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler(handler);
}启动 Serve 端
启动 Client 端,发起请求
1 | 一月 05, 2021 5:22:21 下午 io.grpc.netty.ProtocolNegotiators logSslEngineDetails |