当前位置: 首页 > 知识库问答 >
问题:

如何使用GRPC Java获取客户端证书?

梁德馨
2023-03-14

我有一个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,并希望在我的服务类中以这种方式获得证书:

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

共有1个答案

孔棋
2023-03-14

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

 类似资料:
  • 我有Spring座后端和角前端。 身份验证是使用请求JSON正文中带有用户名和密码的“/登录”URL的POST请求来执行的(我使用基于表单的身份验证)。REST后端回复OK代码。一切都很好,我可以执行来自前端的其他需要身份验证的请求。 但是前端需要知道身份验证用户的角色是什么,以便它可以显示正确的视图/记录。我们从哪里可以在前端得到这个角色?我们从身份验证中得到的唯一响应是OK,这对于REST来说

  • 我有这个代码: 我一直在犯这样的错误: java:不兼容的类型:com。应用句子分类请求。无法将生成器转换为com。应用句子分类请求 我已经使用Maven插件生成了gRPC Java文件。在看了多个例子后,我不确定我的问题是什么。

  • 问题内容: 我想要求基于Java 1.7内置HttpsServer的服务器进行客户端证书认证。 我似乎找不到任何使服务器无法通过身份验证的方法。无论客户端证书是受信任的,未知的还是完全不存在的,它都会愉快地为所有旧客户端提供数据。 我对文档的阅读建议,如果不信任客户端,则设置HttpsParameters.setNeedClientAuth(true)应该会导致身份验证失败。我发现有类似问题的人的

  • 问题内容: 如何使用PHP或javascript获取MAC地址… 问题答案: 如果客户端正在运行Windows,并允许您安装ActiveX控件,则可以使用javascript获取客户端的MAC地址。 http://www.eggheadcafe.com/community/aspnet/3/10054371/how-to-get-client-mac- address.aspx http://co

  • 问题内容: 设置请求客户端身份验证的嵌入式Jetty服务器非常容易:只需添加以下语句即可:SslContextFactory.setNeedClientAuth(true); 配置服务器时访问ssl上下文。在服务器的信任库中具有其证书的任何客户端都将能够建立与服务器的TLS连接。 但是,我需要知道所有可能的受信任客户端中的哪个客户端当前正在发出请求;换句话说,我需要知道在此连接中使用的客户端证书,

  • 问题内容: 在Python中,我使用了这样的请求: 非常简单。 现在,我需要使用Apache HttpClient在Java中实现相同的功能。使用HttpClient进行请求时如何通过客户端证书? 问题答案: 我认为主要区别在于,在Java中,通常将密钥和证书放在密钥存储区中,然后从那里使用它。就像您提到的那样,人们经常希望为此使用单独的库,例如提到的httpcomponents客户端(就像您在p