У меня есть приложение на сервере Java, которое получает данные от клиентов GRPC через TLS и обрабатывает их на сервере.Теперь я хочу работать с несколькими клиентами.Чтобы распределить полученные события с клиентами, я хочу прочитать сертификат клиента и выделить события с DN сертификата.Как я могу получить сертификат клиента?
Я нашел это для построения Сервера: https://github.com/grpc/grpc-java/blob/master/SECURITY.md#mutual-tls
Server server = NettyServerBuilder.forPort(8443)
.addService(new ServerService())
.sslContext(GrpcSslContexts.forServer(certChainFile, privateKeyFile)
.trustManager(clientCAsFile)
.clientAuth(ClientAuth.REQUIRE)
.build())
.intercept(new AuthorizationInterceptor())
.build();
А затем вам нужно внедрить перехватчик сервера
public final static Context.Key<SSLSession> SSL_SESSION_CONTEXT = Context.key("SSLSession");
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call,
Metadata headers, ServerCallHandler<ReqT, RespT> next) {
SSLSession sslSession = call.getAttributes().get(Grpc.TRANSPORT_ATTR_SSL_SESSION);
if (sslSession == null) {
return next.startCall(call, headers);
}
return Contexts.interceptCall(
Context.current().withValue(SSL_SESSION_CONTEXT, sslSession), call, headers, next);
}
Я создал новый Class AuthorizationInterceptor, где я реализовал интерфейс ServerInterceptor и переопределил метод interceptCall выше, и хочу получить сертификат таким образом в своем классе Service:
SSLSession sslSession = AuthorizationInterceptor.SSL_SESSION_CONTEXT.get();
sslSession.getPeerCertificateChain()[0].getSubjectDN();