我想知道需要在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();
Run Code Online (Sandbox Code Playgroud)
在客户端,
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);
Run Code Online (Sandbox Code Playgroud)
根据gRPC在https://github.com/grpc/grpc-java/blob/master/SECURITY.md,
如果需要相互认证,也可以通过创建适当的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, …Run Code Online (Sandbox Code Playgroud) 我需要一段代码,用于我正在编写的程序Boost Asio SSL.我有一个由两个客户组成的系统,它们相互连接.我要求他们进行相互身份验证,因此,在handshake()命令结束时,两个客户端都可以确定其他客户端具有其提供的证书的私钥.两个客户端有一个context对象,让我们打电话给他们ctx1,并ctx2和每个客户端有一个公共的证书和私钥.
是否可以设置上下文对象,当我调用socket.handshake()客户端时将执行双向身份验证.如果没有,那么实现目标的正确方法是什么?
我正在使用带有相互 tls 的 Golang gRPC。是否可以从 rpc 方法获取客户端的证书主题 DN?
// ...
func main() {
// ...
creds := credentials.NewTLS(&tls.Config{
ClientAuth: tls.RequireAndVerifyClientCert,
Certificates: []tls.Certificate{certificate},
ClientCAs: certPool,
MinVersion: tsl.VersionTLS12,
})
s := NewMyService()
gs := grpc.NewServer(grpc.Creds(creds))
RegisterGRPCZmqProxyServer(gs, s)
er := gs.Serve(lis)
// ...
}
// ...
func (s *myService) Foo(ctx context.Context, req *FooRequest) (*FooResonse, error) {
$dn := // What should be here?
// ...
}
Run Code Online (Sandbox Code Playgroud)
是否可以?
好的,服务器发送一个公钥,客户端用它来加密自己的证书信息并发回服务器。我不明白的是为什么攻击者无法拦截步骤 4 中的数据包,然后使用它发送到服务器来冒充客户端。他们不必知道里面的信息或解密它。如果攻击者获得该数据包并保存它,那么当服务器请求客户端证书时,他们可以将这些确切的字节发送到服务器。我不确定这种加密方法如何防止此类攻击。话又说回来,当涉及到套接字级加密时,我完全是个菜鸟,所以我可能会错过一些重要的东西。谢谢!
sockets authentication ssl certificate mutual-authentication
ssl ×3
grpc ×2
boost ×1
boost-asio ×1
c++ ×1
certificate ×1
go ×1
java ×1
sockets ×1
tls1.2 ×1