我有一个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();
答案 0 :(得分:0)
我发现了问题,我忘记绑定到服务器构建器的拦截器中。上面的代码现在可以正常工作!