如何使用GRPC Java获得Clientcertificate?

时间:2019-07-11 13:41:51

标签: java server certificate netty grpc

我有一个Java服务器应用程序,它通过TLS从GRPC客户端获取数据并在服务器上处理它。现在,我想与多个客户一起工作。要与客户端分配接收到的事件,我想读取客户端证书,并使用证书的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并重写了上面的方法invokeCall,并希望以此方式在我的Service类中获取证书:

SSLSession sslSession = AuthorizationInterceptor.SSL_SESSION_CONTEXT.get();
sslSession.getPeerCertificateChain()[0].getSubjectDN();

1 个答案:

答案 0 :(得分:0)

我发现了问题,我忘记绑定到服务器构建器的拦截器中。上面的代码现在可以正常工作!