我想知道在GrpcSslContext中需要设置什么,以便Grpc客户端可以与服务器进行SSL身份验证?
当前,以下代码可用于通常从服务器到客户端的1-way SSL身份验证。
在服务器端,
在客户端,
根据https://github.com/grpc/grpc-java/blob/master/SECURITY.md的gRPC,
感谢任何建议/评论。
[更新]
在进一步排除故障时,我注意到未向客户端发送CertificateRequest消息(如https://en.wikipedia.org/wiki/Transport_Layer_Security#Client-authenticated_TLS_handshake中所述),以启动客户端身份验证。
我的服务器日志摘录如下:......
当前,以下代码可用于通常从服务器到客户端的1-way 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);
根据https://github.com/grpc/grpc-java/blob/master/SECURITY.md的gRPC,
我想知道我是否已正确初始化了GrpcSslContexts?如果需要双向认证,可以通过创建适当的SslContext来支持。
感谢任何建议/评论。
[更新]
在进一步排除故障时,我注意到未向客户端发送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中固有的bug。