Fabric CA的部署与使用
Fabric CA是Hyperledger 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.安装libtool
和libtdhl-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-server
和fabric-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容器。
已有 10 条评论
添加新评论
- 上一篇: Hyperledger fabric在Linux下的环境搭建
- 下一篇: Fabric MSP成员管理
root@iZ2vc5f7gcghe8707vetycZ:/opt/gopath/bin/fabric-ca# make fabric-ca-server
Building fabric-ca-server in bin directory ...
# github.com/hyperledger/fabric-ca/vendor/github.com/cloudflare/cfssl/csr
../../src/github.com/hyperledger/fabric-ca/vendor/github.com/cloudflare/cfssl/csr/csr.go:264:26: cert.URIs undefined (type *x509.Certificate has no field or method URIs)
../../src/github.com/hyperledger/fabric-ca/vendor/github.com/cloudflare/cfssl/csr/csr.go:379:7: tpl.URIs undefined (type x509.CertificateRequest has no field or method URIs)
# github.com/hyperledger/fabric-ca/vendor/github.com/zmap/zlint/lints
../../src/github.com/hyperledger/fabric-ca/vendor/github.com/zmap/zlint/lints/lint_subject_contains_reserved_arpa_ip.go:113:10: undefined: strings.Builder
../../src/github.com/hyperledger/fabric-ca/vendor/github.com/zmap/zlint/lints/lint_subject_contains_reserved_arpa_ip.go:134:10: undefined: strings.Builder
../../src/github.com/hyperledger/fabric-ca/vendor/github.com/zmap/zlint/lints/result.go:75:9: undefined: strings.ReplaceAll
# github.com/hyperledger/fabric-ca/vendor/github.com/go-sql-driver/mysql
../../src/github.com/hyperledger/fabric-ca/vendor/github.com/go-sql-driver/mysql/driver.go:88:33: undefined: driver.Connector
../../src/github.com/hyperledger/fabric-ca/vendor/github.com/go-sql-driver/mysql/driver.go:99:49: undefined: driver.Connector
# github.com/hyperledger/fabric-ca/vendor/github.com/lib/pq
../../src/github.com/hyperledger/fabric-ca/vendor/github.com/lib/pq/notify.go:47:2: undefined: driver.Connector
你好遇到这种问题怎么办,是gopath得设置问题吗
无论是1.直接从github下载源码并编译
还是2.手动编译生成都会出现这个情况
看起来像和fabric-ca的版本有关,你用的是哪个版本的?
1.4.10 不过这个问题为什么突然自己消失了,但是出现了新问题,
/opt/gopath/src/github.com/hyperledger/fabric-ca/bin# fabric-ca-server init -b admin:adminpw
fabric-ca-server: command not found
输入与ca相关的命令都会显示command not found
但是今天早上突然好了,晚上弄另一个终端得时候又出现了这个问题
这是在容器里还是机器上?应该是环境变量的问题,确认一下fabric-ca-server的路径是否添加到环境变量了
请问我在手动编译时出现以下错误 求解答
Building fabric-ca-client in bin directory ...
cannot find package "." in:
/usr/local/go/src/github.com/hyperledger/fabric-ca/cmd/fabric-ca-client
Makefile:110: recipe for target 'bin/fabric-ca-client' failed
make: *** [bin/fabric-ca-client] Error 1
看上去像缺少依赖,请问你的fabric-ca是什么版本呢,我在1.1和1.4版本都是可以成功编译的。
我使用的1.2
我在1.2版本可以试验成功,步骤如下:
1.在 $GOPATH 路径下拉取fabric-ca源码
git clone https://github.com/hyperledger/fabric-ca
2.切换1.2分支
git checkout release-1.2
3.编译
make fabric-ca-client
你是用的什么操作系统?建议在linux或者macOS下执行。 如果还不行加下我qq帮你看下吧
请问这是多机部署对吗?可以只在单机部署吗?我看到上一篇有docker,这一篇又在另一台机子上面部署了。
这就是单机部署的,不过是介绍了多种方式,是否使用docker都行的