gpt4 book ai didi

java - Grpc Java SSL 相互认证

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:54:34 25 4
gpt4 key购买 nike

我想知道需要在 GrpcSslContext 中设置什么才能让 Grpc Client 对服务器进行 SSL 身份验证?

目前,以下代码适用于从服务器到客户端的通常的单向 SSL 身份验证。

在服务器上,

SslContext sslContext = GrpcSslContexts.forServer(new File(pathToOwnCertPemFile), new File(pathToOwnPrivateKeyPemFile)).trustManager(new File(pathToClientCertPemFile)).build();

ServerImpl server = NettyServerBuilder
.forPort(port)
.sslContext(sslContext)
.addService(MyGrpc.bindService(new MyGrpcService()))
.build().start();

在客户端,

SslContext sslContext = GrpcSslContexts.forClient().trustManager(new File(pathToServerCertPemFile)).keyManager(new File(pathToOwnCertPemFile), new File(pathToOwnPrivateKeyPemFile)).build();

ChannelImpl channel = NettyChannelBuilder.forAddress(host, port)
.negotiationType(NegotiationType.TLS)
.sslContext(sslContext).build();

blockingStub = MyGrpc.newBlockingStub(channel);
asyncStub = MyGrpc.newStub(channel);

根据 gRPC 在 https://github.com/grpc/grpc-java/blob/master/SECURITY.md ,

If mutual authentication is desired this can also be supported by creating the appropriate SslContext.

我想知道我是否正确初始化了 GrpcSslContexts?

如有任何建议/意见,我们将不胜感激。

[更新]

进一步排除故障后,我注意到 CertificateRequest 消息(如 https://en.wikipedia.org/wiki/Transport_Layer_Security#Client-authenticated_TLS_handshake 中所述)从未发送到客户端以启动客户端身份验证。

我的服务器日志的摘录如下:……

*** ECDH ServerKeyExchange
Signature Algorithm SHA512withRSA
Server key: Sun EC public key, 256 bits
public x coord: 81392923578261760187813715443713168545877454618233337093852615933913992434989
public y coord: 26389586381130695169212775668808794166799180199461581135201001980310825571555
parameters: secp256r1 NIST P-256, X9.62 prime256v1
*** ServerHelloDone
[write] MD5 and SHA1 hashes: len = 1617
0000: 02 00 00 56 03 03 55 DF 34 10 9C 73 B5 00 C2 70 ...V..U.4..s...p
0010: FD B8 CC 36 5B 83 87 70 5B 74 A3 D2 AD B7 75 3B ...6[..p[t....u;
....

我开始怀疑它可能是 gRPC 中的固有错误。

最佳答案

编辑:添加了支持。制作您自己的 SslContext 并将其传递给 NettyChannelBuilder.sslContext() , 确保通过 SslContextBuilder.clientAuth() 请求客户端证书.然后为每个 RPC 检查 ClientCall.getAttributes()并通过 Grpc.TRANSPORT_ATTR_SSL_SESSION 获取 SSLSession .


看起来确实是 gRPC-Java does not have a way在服务器上请求客户端证书,这是相互身份验证所必需的。考虑到 SSL/TLS 的工作原理,这并不是一个错误,而是更多的功能请求。

Java 实现尚未支持客户端证书作为完整功能。这将包括能够在服务器上检索客户端证书。请求客户端身份验证的能力必须是该功能的一部分。

Client auth 是 grpc-Java 有意支持的东西,但还没有开始工作。

关于java - Grpc Java SSL 相互认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32222389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com