【发布时间】:2019-11-21 06:11:02
【问题描述】:
我有一个 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);
}
我新建了一个类AuthorizationInterceptor,在其中实现了接口ServerInterceptor并重写了上面的interceptCall方法,想在我的Service类中以这种方式获取证书:
SSLSession sslSession = AuthorizationInterceptor.SSL_SESSION_CONTEXT.get();
sslSession.getPeerCertificateChain()[0].getSubjectDN();
【问题讨论】:
标签: java server certificate netty grpc