Как получить сертификат клиента с GRPC Java? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть приложение на сервере 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();

1 Ответ

0 голосов
/ 12 июля 2019

Я нашел проблему, я забыл связать в перехватчик в построителе сервера.Код выше работает сейчас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...