【问题标题】:How do I get the Clientcertificate with GRPC Java?如何使用 GRPC Java 获得 Clientcertificate?
【发布时间】: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


    【解决方案1】:

    我发现了问题,我忘记在服务器生成器中的拦截器中绑定。上面的代码现在可以运行了!

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多