首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在grpc服务器端检索正在调用的SSL证书

在grpc服务器端检索正在调用的SSL证书
EN

Stack Overflow用户
提问于 2017-03-10 12:56:22
回答 2查看 1.9K关注 0票数 1

我有一个gRPC客户机/服务器组合,它使用SSLCredentials方法加密通信。我试图在服务器端(用C++编写)检索客户端的SSL证书,以便区分调用服务器的不同客户端。

到目前为止,我只找到了一个围棋的例子,这似乎很粗略,但在C++方面,我只能找到只提供下面信息的AuthMetadataProcessor过载,这不是我所需要的。

代码语言:javascript
复制
:authority  =  localhost:50051
:path  =  /API.GameDatabase/saveData
grpc-accept-encoding  =  identity,deflate,gzip
grpc-encoding  =  identity
user-agent  =  grpc-csharp/1.0.1 grpc-c/1.0.1 (linux; chttp2)
Dispatch value:  "/API.GameDatabase/saveData"

这是可能的,还是我必须自己发送这种元数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-19 03:49:57

如果您决定使用此类拦截器从处理程序的业务逻辑中提取身份验证/授权逻辑,则可以在响应处理程序的响应处理程序中使用AuthContext检索客户端的SSL证书。context.html

如果存在或不存在CN,则将X509的对等标识属性设置为SAN。但是,您可以通过使用8h.html#ad46c3fd565d6a24eeb25d1fdc342cb28属性访问完整的证书,该属性在AuthContext中填充。

票数 0
EN

Stack Overflow用户

发布于 2017-06-02 08:52:09

在Julien的回答的帮助下,我能够让它开始工作,我接受了他的答案,但是给出了下面的代码示例:

代码语言:javascript
复制
grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp =
{"<key>", "<cert>"};

// The client must be force to present a cert every time a call is made,
// else it will only happen once when the first connection is made.
// The other options can be found here:
// http://www.grpc.io/grpc/core/grpc__security__constants_8h.html#a29ffe63a8bb3b4945ecab42d82758f09
grpc::SslServerCredentialsOptions 
ssl_opts(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);

ssl_opts.pem_root_certs = "<CA cert>";
ssl_opts.pem_key_cert_pairs.push_back(pkcp);

std::shared_ptr<grpc::ServerCredentials> sslCredentials = 
grpc::SslServerCredentials(ssl_opts);

builder.AddListeningPort("<server address>", sslCredentials);

有两个选项可以检索ssl证书:

  1. 子类AuthMetaDataProcessor (有关更多信息,请参阅此帖子。),通过这种方式,您将能够在每次调用时在中心位置获得ssl证书: 在构建服务器sslCredentials->SetAuthMetadataProcessor(auth_processor);之前,std::shared_ptr auth_processor = std::make_shared();//将元数据处理器添加到ssl凭据中 然后在overriden过程函数中: 状态进程(ConstInputMetada&auth_metadata,grpc::AuthContext* context,OutputMetadata* consumed_auth_metadata,OutputMetadata* response_metadata)覆盖{ std::string = context->FindPropertyValues("x509_pem_cert").front().data();返回grpc::Status::OK;}
  2. 从为每个呼叫提供的ServerContext中获取它 std::string cert = context->auth_context()->FindPropertyValues("x509_pem_cert").front().data();

我希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42718957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档