专栏首页ZYJ的技术专栏Fabric CA的部署与使用

Fabric CA的部署与使用

Fabric CAHyperledger fabric的证书认证中心,提供以下功能:用户信息的登记与注册,数字证书的颁发与管理

前言

之前使用CA服务一直是在docker容器中运行下载好的CA镜像,在应用程序中通过Node SDK中集成的接口来访问CA服务器,这次尝试手动部署CA服务。

Fabric CA由服务端和客户端组件组成,CA服务端(fabric-ca-server)可以看作一个web服务,执行了Go代码编译生成的二进制文件后,会监听一个端口,处理收到的请求。

CA客户端(fabric-ca-client)其实就是一个向CA服务端发送请求的程序,执行编译成的二进制文件并带上不同参数,可以向CA服务器发送相应的http请求,完成一系列操作。

准备工作

1.安装Go语言并配置好GOPATH环境变量,下载并配置docker

2.安装libtoollibtdhl-dev

sudo apt install libtool libltdl-dev

通过命令行安装和启动CA

1.直接从github下载源码并编译

go get -u github.com/hyperledger/fabric-ca/cmd/fabric-ca-server
go get -u github.com/hyperledger/fabric-ca/cmd/fabric-ca-client

go get命令会自动获取源码并编译至$GOPATH/bin,我的目录是~/go/bin,目录下出现编译好的二进制可执行文件fabric-ca-server和`fabric-ca-client

接着初始化和启动fabric-ca-server,需要设置一个管理员用户的名称和密码

fabric-ca-server init -b admin:adminpw
fabric-ca-server start -b admin:adminpw

在这里报错panic: Version is not set for fabric-ca library,可能与下载的fabric-ca版本有关系(此时最新为v1.1)。

2.手动编译生成 既然直接从github下载的版本出现错误,可以选择手动去编译生成指定版本的fabric-ca-server。 首先下载fabric-ca源码并切换至相应版本:

git clone https://github.com/hyperledger/fabric-ca.git
git checkout v1.1.0

然后在fabric-ca目录下进行编译

make fabric-ca-server
make fabric-ca-client

会在fabric-ca/bin目录下生成fabric-ca-serverfabric-ca-client。接着进入bin目录对CA服务端进行初始化:

fabric-ca-server init -b admin:adminpw                 

初始化后在目录下生成

  • msp:包含keystore,CA服务器的私钥
  • ca-cert.pem:CA服务器的证书
  • fabric-ca-server.db:CA默认使用的嵌入型数据库 SQLite
  • fabric-ca-server-config.yaml:CA服务端的配置文件

接着启动CA服务器

fabric-ca-server start -b admin:adminpw                 

CA server开始监听,默认监听地址为http://0.0.0.0:7054

通过docker镜像安装和启动CA

除了直接运行CA服务器程序,还可以利用docker容器来启动CA,fabric-ca镜像中同时包含了fabric-ca-server和fabric-ca-client组件。

1.直接下载fabric-ca镜像 首先可以选择从Docker Hub直接拉取fabric-ca镜像:

docker pull hyperledger/fabric-ca:x86_64-1.1.0

利用docker-compose.yml文件来启动镜像,配置文件在fabric-ca/docker/server中(需要从github克隆fabric-ca),进入该目录后启动:

docker-compose up

即可启动ca容器,如果镜像不存在还会主动拉取镜像。在.../server/fabric-ca-server目录中会生成CA配置文件,证书私钥,数据库文件等(这些是在CA容器中生成并映射到外部的),并且开始监听端口。

2.手动编译docker镜像 除了直接从Docker Hub拉取fabric-ca镜像,还可以通过源码编译生成镜像。 在fabric-ca目录下执行:

make docker

会生成四个镜像fabric-ca,fabric-ca-tool,fabric-ca-peer,fabric-ca-orderer,镜像保存在fabric-ca/build/image中,之后和上面的方法相同都是根据docker-compose.yml文件启动ca节点。

Fabric CA的使用

访问Fabric CA服务端的方法有两种:通过客户端工具(fabric-ca-client)和RESTful接口。本质上,客户端工具也是调用服务端的RESTful接口实现的。这里采用客户端工具的方法来进行访问。

首先按照上述步骤初始化和启动CA服务器(执行fabric-ca-server或启动CA容器),如果已经下载fabric-ca-client,那移动到相应目录下即可开始操作(若已添加至环境变量则不用)。如果是以docker容器方式运行CA服务器且未下载客户端工具,可以进入容器内部进行测试(ca镜像集成了服务端和客户端组件),fabric-ca-client放在/usr/local/bin且已经添加环境变量,进入方法为:

docker exec -it fabric-ca-server bash

下面选择直接运行编译好的可执行文件的方法来测试fabric-ca,首先在一个终端下启动CA服务器:

fabric-ca-server start -b admin:adminpw

用户的注册过程分为登记(register)注册(enroll)两步,注册操作需要拿到登记密码才能完成,且用户的登记需要有一个登记员用户。所以首先需要注册我们在启动时设置的管理员用户(admin的登记密码在启动时已设置),然后用这个admin用户来完成其他用户的登记操作。

在另一个终端操作CA客户端,注册前需要设置证书存储目录的环境变量。

export FABRIC_CA_CLIENT_HOME=$HOME/ca
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054

可以发现~/ca目录下生成了一个fabric-ca-client-config.yaml配置文件,以及msp目录,包含管理员的证书和私钥。有了已经enroll成功的admin用户,接下来将admin作为登记员(Registrar)来登记(register)一个新用户:

fabric-ca-client register --id.name Jim --id.type user --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,foo=bar'

客户端可以接收到一个密码,用这个注册密码来注册(enroll)用户:

fabric-ca-client enroll -u http://Jim:IGIMqptUPBRc@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/Jim

这样一个新用户就注册成功了,拥有了属于自己的证书和私钥。

总结

总结一下,手动部署CA服务可以分为两类方法:

  • 一种方法是在命令行直接运行编译过后的可执行文件,可以通过go get命令自动获取并编译(最新版本有报错),也可以手动获取源码,切换版本后再进行编译, 然后在命令行中初始化和启动CA服务器;
  • 另一种方法是在docker容器中运行fabric-ca镜像,镜像中包含编译好的可执行文件,镜像可以从Docker Hub直接下载,也可以在fabric-ca目录下利用make docker手动编译,然后使用docker-compose命令启动CA容器。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Fabric应用开发

    前面提到的fabric示例(如first-network和e2e-cli)都只是在单机上的简单测试,启动一个cli命令行容器来与网络成员节点进行交互,通过在cl...

    zhayujie
  • MIT6.828/6.S081-2019:MacOS下risc-v和xv6环境搭建

    只有了解底层原理才能写好上层应用,曾经几度想要系统地学习OS课程,尝试去看了《计算机操作系统》、《Operating Systems: Three Easy P...

    zhayujie
  • Fabric MSP成员管理

    Fabirc的成员身份基于标准的X.509证书,密钥使用的是ECDSA算法,利用PKI体系给每个成员颁发数字证书,通道内只有相同MSP内的节点才可以通过Goss...

    zhayujie
  • webapi文档描述-swagger

      最近做的项目使用mvc+webapi,采取前后端分离的方式,后台提供API接口给前端开发人员。这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开...

    用户1168362
  • 速读原著-TCP/IP(CIDR:无类型域间选路)

    在第3章中,我们指出了 B类地址的缺乏,因此现在的多个网络站点只能采用多个 C类网络号,而不采用单个 B类网络号。尽管分配这些 C类地址解决了一个问题( B类地...

    cwl_java
  • Python使用RMF聚类分析客户价值

    投资机构或电商企业等积累的客户交易数据繁杂。需要根据用户的以往消费记录分析出不同用户群体的特征与价值,再针对不同群体提供不同的营销策略。

    Python疯子
  • daemon函数结合脚本实现start, stop, restart

    1. daemon函数 Daemon程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端不与前台交互,Daemon程序一般作为系统...

    一灰灰blog
  • iOS 开发:『Runtime』详解(四)获取类详细属性、方法

    文中示例代码在: bujige / YSC-Class-DetailList-Demo

    行走少年郎
  • 勒索软件Cryptolocker最新变种感染群晖NAS网络存储设备

    2014年肆虐互联网的勒索软件Cryptolocker变种正如雨后春笋般涌现。现在,Cryptolocker开始向群晖(Synology)网络存储器设备(NAS...

    安恒信息
  • PDF新建空白页的方法有哪些?怎么新建PDF文件

    大家知道哪些PDF新建空白页的方法?问到这个问题大家都是不约而同的眉头紧锁,小编理解的可能是大家都不知道怎么新建PDF空白页吧。

    用户5843321

扫码关注云+社区

领取腾讯云代金券