本文介绍Fabric-ca server端和client端的交互过程。

在server端执行Start()命令时,会调用registerHandlers()函数,其作用就是注册处理客户端请求的程序:

// fabric-ca/lib/server.go

// Register all endpoint handlers
func (s *Server) registerHandlers() {
s.mux.Use(s.cors, s.middleware)
s.registerHandler(newCAInfoEndpoint(s))
s.registerHandler(newRegisterEndpoint(s))
s.registerHandler(newEnrollEndpoint(s))
s.registerHandler(newIdemixEnrollEndpoint(s))
s.registerHandler(newIdemixCRIEndpoint(s))
s.registerHandler(newReenrollEndpoint(s))
s.registerHandler(newRevokeEndpoint(s))
s.registerHandler(newTCertEndpoint(s))
s.registerHandler(newGenCRLEndpoint(s))
s.registerHandler(newIdentitiesStreamingEndpoint(s))
s.registerHandler(newIdentitiesEndpoint(s))
s.registerHandler(newAffiliationsStreamingEndpoint(s))
s.registerHandler(newAffiliationsEndpoint(s))
s.registerHandler(newCertificateEndpoint(s))
} // Register a handler
func (s *Server) registerHandler(se *serverEndpoint) {
s.mux.Handle("/"+se.Path, se).Name(se.Path)
s.mux.Handle(apiPathPrefix+se.Path, se).Name(se.Path)
}

这里以newCAInfoEndpoint()为例来介绍server端与client端的交互过程。

// fabric-ca/lib/serverinfo.go

// ServerInfoResponseNet is the response to the GET /cainfo request
type ServerInfoResponseNet struct {
// CAName is a unique name associated with fabric-ca-server's CA
CAName string
// Base64 encoding of PEM-encoded certificate chain
CAChain string
// Base64 encoding of idemix issuer public key
IssuerPublicKey string
// Version of the server
Version string
} func newCAInfoEndpoint(s *Server) *serverEndpoint {
return &serverEndpoint{
Path: "cainfo",
Methods: []string{"GET", "POST", "HEAD"},
Handler: cainfoHandler,
Server: s,
}
} // Handle is the handler for the GET or POST /cainfo request
func cainfoHandler(ctx *serverRequestContextImpl) (interface{}, error) {
ca, err := ctx.GetCA()
if err != nil {
return nil, err
}
resp := &common.CAInfoResponseNet{}
err = ca.fillCAInfo(resp)
if err != nil {
return nil, err
}
resp.Version = metadata.GetVersion()
return resp, nil
}

Note:假设server的IP为“192.168.1.20”,端口为“8888”

从上面的代码不难看出,server端对于URL为http://192.168.1.20:8888/cainfo,提供三种方法,分别为GETPOSTHEAD。本文中为GET方法为例。

此时,client端需要执行的命令就是newGetCAInfoCmd().getCommand(),在runGetCACert()函数中,会构造一个api.GetCAInfoRequest结构,通过lib.Client.GetCAInfo()函数来发送请求并接受server端的响应。

// fabric-ca/cmd/fabric-ca-client/command/getcainfo.go

func (c *getCAInfoCmd) getCommand() *cobra.Command {
cmd := &cobra.Command{
Use: GetCAInfoCmdUsage,
Short: GetCAInfoCmdShortDesc,
Aliases: []string{"getcacert"},
PreRunE: c.preRunGetCACert,
RunE: c.runGetCACert,
}
return cmd
}

server端收到请求后,调用newCAInfoEndpoint()方法处理请求。在newCAInfoEndpoint()中会调用cainfoHandler()函数,该函数才是处理程序的本体。

cainfoHandler()中,首先会调用serverRequestContextImpl.GetCA()来获取server端CA的信息,并将获取到的信息存入到CA结构体中,之后构造一个common.CAInfoResponseNet{}结构体,随后调用CAfillCAInfo()方法将CA信息填充到结构体中,返回响应信息。

// fabric-ca/lib/common/serversponses.go

// CAInfoResponseNet is the response to the GET /info request
type CAInfoResponseNet struct {
// CAName is a unique name associated with fabric-ca-server's CA
CAName string
// Base64 encoding of PEM-encoded certificate chain
CAChain string
// Base64 encoding of Idemix issuer public key
IssuerPublicKey string
// Base64 encoding of PEM-encoded Idemix issuer revocation public key
IssuerRevocationPublicKey string
// Version of the server
Version string
}

Fabric-ca server端与client端交互的更多相关文章

  1. 在socket的server端处理client端发来的数据

    一.楔子 最近做了一个需求遇到一个坑,归结成一个小问题,其实就是在socket的server端处理client端发来的数据的问题,现将这个问题总结一下,本文将数据在server端以字典的形式存储. 另 ...

  2. 用同一台PC的两个网口实现Iperf的server端和client端

    用同一台PC的两个网口实现Iperf的server端和client端 2015年10月20日 20:35:11 阅读数:2943 有时候需要发包,仅仅需要一定速率的流量,并不需要关心收到报文的大小,一 ...

  3. 【Tech】CAS多机部署Server和Java Client端

    昨天尝试把cas的java client端部署到另外一台机器,结果就有问题了.(localhost部署cas server和java client端参见:http://www.cnblogs.com/ ...

  4. 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)

    这个多亏了网站上的一个大神的博客: http://blog.csdn.net/forezp/article/details/70148833 强烈推荐学习: 1.springcloud是什么,这个大家 ...

  5. 使用gRPC搭建Server端与Client端

    gRPC简介 gRPC是一种RPC框架技术,采用Protocal Buffers(协议缓存) 作为其接口定义的语言(就是Proto来写接口)和基础的消息交换格式. 在gRPC中,客户端应用程序可以直接 ...

  6. Spring Cloud config之三:config-server因为server端和client端的健康检查导致服务超时阻塞问题

    springcloud线上一个问题,当config-server连不上git时,微服务集群慢慢的都挂掉. 在入口层增加了日志跟踪问题: org.springframework.cloud.config ...

  7. Fabric CA/数字证书管理

    MSP(Membership Service Provider)成员管理服务提供商 名词: 1.CSR(Cerificate Signing Request):证书签署请求文件 CSR里包含申请者的 ...

  8. Hyperledger:Fabric CA 用户指南 [译]

    Fabric CA 用户指南 Fabric CA 是 Hyperledger Fabric 的官方配套认证设施. 原文链接:http://hyperledger-fabric.readthedocs. ...

  9. Hyperledger Fabric CA User’s Guide——开始(三)

    Fabric CA User’s Guide——开始 先决条件 安装Go 1.9+ 设置正确的GOPATH环境变量 安装了libtool和libtdhl-dev包 下面是在Ubuntu上安装libto ...

  10. Fabric CA环境的集成

    我们前面关于Fabric的所有文章中用到的例子都没有CA Server,都是由cryptogen这个工具根据crypto-config.yaml而生成的.但是在实际生产环境中,我们肯定不能这么做,我们 ...

随机推荐

  1. SpringBoot Docker Skywalking agent 不生效

    SpringBoot Skywalking agent 通过 Dockfile 配置 不生效 ENTRYPOINT ["java","-Djava.security.eg ...

  2. C# .NET Socket SocketHelper 高性能 5000客户端 异步接收数据

    网上有很多Socket框架,但是我想,C#既然有Socket类,难道不是给人用的吗? 写了一个SocketServerHelper和SocketClientHelper,分别只有5.6百行代码,比不上 ...

  3. # 2027 ( 统计元音 ) :hash应用

    Problem Description 统计每个元音字母在字符串中出现的次数. Input 输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串. Output 对于每个 ...

  4. 聚焦 AIGC,函数计算为 AI 应用插上腾飞翅膀

    6月1日,2023 阿里云峰会·粤港澳大湾区在广州举办,Serverless 加速创新分论坛如约亮相,阿里云函数计算 FC 聚焦 AIGC 应用开发,GPU 性能体验再升级,让 AIGC 应用开发更简 ...

  5. vue学习笔记 五、创建子组件实例

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  6. 关于 uintptr_t和intptr_t 类型

    简介 最近在看代码时,发现了两个之前没见过的数据类型:intptr_t,uintptr_t.这两个数据类型是ISO C99定义的,具体代码在linux平台的/usr/include/stdint.h头 ...

  7. SpringBoot 动态多线程并发定时任务

    一.简介 实现定时任务有多种方式: Timer:jdk 中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行.提供的功能比较单一,无法实现复杂的调度任务. ScheduledExecutorS ...

  8. 一种 C++ 转换的非正式分类

    C++ 正式分类方法是直接按语法分类,分为:隐式转换和显示转换.隐式转换又称为标准转换.显示转换又分为:C 风格转换.函数风格转换.C++ 风格转换.C++风格转换就是 static_cast.dyn ...

  9. 浅谈 Docker 网络:单节点单容器

    1.Docker 网络模型 Docker 在 1.7 版本中将容器网络部分代码抽离出来作为 Docker 的网络库,叫 libnetwork.libnetwork 中使用 CNM(Container ...

  10. 分享 ASCII 字符集的字模

    是做 VGA 显示屏时用到的,这是字模资源:gitee 链接 以下为字模代码: // 133 * 16 * 8 字模的 parameter reg [127:0] C_ascii_character ...