Fabric CA 1.4入门

Zealot
区块链
2019-02-19

1.简介

Fabric CA基于开源项目CFSSL开发, 主要为fabric网络提供PKI证书服务,是MSP生成的基础。
可能有人会问, 官方不是有cryptogen工具批量生成MSP吗? cryptogen实际是辅助测试工具,默认不同orderer,org都有不同的CA, 如果一个org要追加个peer或user, cryptogen就不管用了。生产环境我们建议使用fabric ca全面管理证书, 如果想简单来而区块链组织,节点和用户基本不会变, cryptogen也没问题。

2.架构

t_bfdd38ffe95f40d5b5f6ae4b109d8788.png

我们在MSP已有类似提过。
https://www.javatree.cn/news/db31d44e278f40179116ad9f3a5618cc
Fabric CA默认部署为restful服务, 单点默认使用sqlite, 也可使用nginx, ha-proxy, keepalive实现高可用和均衡负载, 支持mysql等数据库持久化。

3.Fabric-CA启动

可以参考fabric-sample的basic-network例子启动ca。 有点要注意, 默认镜像是设置了账号为admin/adminpw.

docker inspect hyperledger/fabric-ca:1.4.0

会发现默认会执行

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

编写Docker-compose文件时command最好覆盖

command: sh -c 'fabric-ca-server start -b yourAccount:yourPassword'

貌似不大好, CA账户密码都暴露出来了。是否可以像传统数据库那样启动, 账号就保存在数据库里面。

默认sqlite是可以处理下, docker起个容器, 用清空配置, 使用fabric-ca-server init -b重新指定账号密码, 重新编辑生成的fabric-ca-server-config.yaml, 全部配置好使用新的这套配置启动fabric-ca即可。

使用mysql就还是得在fabric-ca-server-config.yaml配置数据库链接的账号密码, 绕不过。但是一个原则就是fabric-ca启动了, 务必不能让使用默认账号admin/adminpw, 就好像ssh暴露root账号一样危险。

4.Fabric-ca配置

实际上ca启动优先是命令行传入的参数, 其次是docker-compose环境变量, 再是fabric-ca-server-config.yaml配置, 参数较多, 我们就以yaml讲解具体配置, 里面也有不少注释,讲几个注意的点。

CA开启HTTPS需要配置enabled=true, 或者通过环境变量FABRIC_CA_TLS_ENABLED=true,
签名证书certfile,私钥keyfile, 可以使用互联网正式CA颁发的或自签名, 看使用场景。

tls:
  # Enable TLS (default: false)
  enabled: false
  # TLS for the server's listening port
  certfile:
  keyfile:
  clientauth:
    type: noclientcert
    certfiles:

数据库默认是sqlite3, 也可以配置为mysql, datasource例如为

root:rootpw@tcp(localhost:3306)/fabric_ca?parseTime=true&tls=custom

如果用mysql5.7要保证日期格式允许’0000-00-00’, 即my.cnf删除NO_ZERO_DATE。

db:
  type: sqlite3
  datasource: fabric-ca-server.db
  tls:
      enabled: false
      certfiles:
      client:
        certfile:
        keyfile:

Affiliations也是组织机构部门, CA register用户使用, 客户端可创建新的affiliation, affiliation笔者也有些疑惑,后面注册时说明。

affiliations:
   org1:
      - department1
      - department2
   org2:
      - department1

签名有时效性,默认是1年半年, 按照实际需求适当的调整时间。

signing:
    default:
      usage:
        - digital signature
      expiry: 87600h
    profiles:
      ca:
         usage:
           - cert sign
           - crl sign
         expiry: 438000h
         caconstraint:
           isca: true
           maxpathlen: 0
      tls:
         usage:
            - signing
            - key encipherment
            - server auth
            - client auth
            - key agreement
         expiry: 87600h

CSR涉及到CA根证书的创建,可适当修改里面的名称, CA根证书默认15年有效。

csr:
   cn: fabric-ca-server
   keyrequest:
     algo: ecdsa
     size: 256
   names:
      - C: US
        ST: "North Carolina"
        L:
        O: Hyperledger
        OU: Fabric
   hosts:
     - 28e9b53aaa88
     - localhost
   ca:
      expiry: 131400h
      pathlength: 1

还有不少配置,参考官方文档
https://hyperledger-fabric-ca.readthedocs.io/en/release-1.1/users-guide.html
相对方便些应该还是把这些YAML配置项设置为对应的环境变量方便些。

5.注册用户

一些固定的用户我们可以使用fabric-ca-client生成。
默认的admin账号获取到证书

CA_ADMIN_ID="admin:adminpw"
fabric-ca-client enroll -H ca-admin-home -d   -u http://$CA_ADMIN_ID@localhost:7054

ca-admin-home结构如下, 主要是msp

[root@k8s-master ca-admin-home]# tree 
.
├── fabric-ca-client-config.yaml
└── msp
    ├── cacerts
    │   └── localhost-7054.pem
    ├── IssuerPublicKey
    ├── IssuerRevocationPublicKey
    ├── keystore
    │   └── 570aaaaadb9b185e68d6e6ae9c102bc2f04326b96f340568400e45a4fd9af71e_sk
    ├── signcerts
    │   └── cert.pem
└── user

假设创建orderer

CA_ADMIN_ID="admin@:adminpw"
ORDERER_NAME="orderer.example.com"
ORDERER_SECRET="123456"
fabric-ca-client register -H ca-admin-home  --id.name $ORDERER_NAME --id.secret $ORDERER_SECRET  --id.type orderer  -u  http://$CA_ADMIN_ID@localhost:7054
fabric-ca-client enroll  -H orderer-home --csr.names C=cn,ST=hubei,L=wuhan,O=example.com  -u http://$ORDERER_NAME:$ORDERER_SECRET@localhost:7054

生成目录, 里面是没tlsca的内容的, 可能需要额外再起创建账号生成一套。

[root@k8s-master orderer-home]# tree
.
├── fabric-ca-client-config.yaml
└── msp
    ├── cacerts
    │   └── localhost-7054.pem
    ├── IssuerPublicKey
    ├── IssuerRevocationPublicKey
    ├── keystore
    │   └── bb9de343d9bb7f92a02fa74b3be9e87fd8e3d6df78aa4cec17f0dcc6d2e2d259_sk
    ├── signcerts
    │   └── cert.pem
    └── user

时不时也要用openssl查看下证书内容, 尽量和cryptogen类似
openssl x509 -in cert.pem -noout -text

官方给出的很多例子, 都是通过O, OU等实际去确定角色, 例如first-network例子里org1的MSP里的config.yaml

NodeOUs:
  Enable: true
  ClientOUIdentifier:
    Certificate: cacerts/ca.org2.example.com-cert.pem
    OrganizationalUnitIdentifier: client
  PeerOUIdentifier:
    Certificate: cacerts/ca.org2.example.com-cert.pem
    OrganizationalUnitIdentifier: peer

而Java版fabric-ca-client SDK注册的时候可以传入affiliation, 命令行实际也可以设置, 但只是在生成证书的最后一段属性有生成, 可能hf.Type等就是默认直接对应到OU的角色, client, admin等, 但是cryptogen生成的内容是不包含这些attrs的,有点诡异,这些估计只能去跟源码了。

[root@k8s-master signcerts]# openssl x509 -in cert.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            1a:65:3f:d1:27:60:fd:80:b8:50:c7:6a:36:0c:c9:6a:1e:e9:d0:83
    Signature Algorithm: ecdsa-with-SHA256
        Issuer: C=US, ST=California, L=San Francisco, O=org1.example.com, CN=ca.org1.example.com
        Validity
            Not Before: Feb 19 11:36:00 2019 GMT
            Not After : Feb 19 11:41:00 2020 GMT
        Subject: C=cn, ST=hubei, L=wuhan, O=example.com, OU=orderer, CN=orderer.example.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub: 
                    04:0f:5f:d3:82:d1:41:7f:5a:30:1e:5c:33:85:23:
                    af:4c:56:20:ad:38:86:e6:cd:59:53:9f:61:e4:ac:
                    c8:1f:79:11:d2:c1:75:e6:7c:2d:94:d4:eb:73:e1:
                    7f:25:36:73:61:c2:03:7c:8e:01:42:bd:65:dd:25:
                    2f:ad:df:a1:e1
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier: 
                92:EF:D0:BB:EE:81:C0:4B:0F:F1:38:40:63:0D:A8:C7:53:D8:25:4C
            X509v3 Authority Key Identifier: 
                keyid:42:39:AA:0D:CD:76:DA:EE:B8:BA:0C:DA:70:18:51:D1:45:04:D3:1A:AD:1B:2D:DD:DB:AC:6A:57:36:5E:49:7C

            X509v3 Subject Alternative Name: 
                DNS:k8s-master
            1.2.3.4.5.6.7.8.1: 
                {"attrs":{"hf.Affiliation":"","hf.EnrollmentID":"orderer.example.com","hf.Type":"orderer"}}
    Signature Algorithm: ecdsa-with-SHA256
         30:44:02:20:5d:a5:09:bb:16:7e:89:0b:d7:00:f8:fc:17:fe:
         e3:7b:06:68:2b:0c:cf:d5:e6:5a:95:82:5b:cf:e7:06:7b:05:
         02:20:44:65:90:da:34:1e:e3:b1:b7:09:a7:64:27:d8:6b:6d:
         6c:e1:56:14:db:5d:68:aa:80:b4:3a:a0:2e:a6:f1:70

而java fabric-ca-client SDK用法我们在开源项目有相应代码, 也可以参考下用SDK注册用户
https://github.com/zealzeng/fabric-rest

6.小结

先来个入门,官方的文档实际还有不少内容不知道如何用在fabric的部署当中用到,1.3的id mixer还没用上,把东西做复杂不是自豪的事情,但有那么多大公司撑着fabric, 将就用着吧。

t_9f4a284840c74b9ea2cf907848fb5490.png

点赞 1
8条评论
Zealot
2019-06-19
这个网站带着一群学生做的,bug自然是不少的:p,回复这块会抽空完善下。多谢关注@dahan
Zealot
2019-06-19
首先fabric-ca先启动,fabric会暴露出服务,我们可以使用fabric-ca-client开发SDK或者fabric-ca-client命令行去为不同的组织注册证书。 然后把这些证书类似cryptogen工具生成目录/crypto-config/{ordererOrg, peerOrg}... 最后写好docker-composer.yaml启动网络
Zealot
2019-06-19
如果严格的区块链,每个org认为是单独的一个公司,每个公司的数字证书可能是它自己的CA服务器颁发的, 也可能是公网的一些例如浏览器那种顶级的CA公司颁发的(价格不便宜)。 如果fabric作为联盟链,假设主要是某个公司运营的,那么我们也可以用运营公司的CA服务器(可以用opelssl自签名,或搭建fabric ca等等方式) 去为每个peer-org, orderer-org颁发证书。不同组织最好证书不一样。
dahan
2019-06-18
3. 评论框过于简单,就只能输入一行,容易不小心按了 “Enter” 把没有写完的评论发布了,请忽视最初的两个评论:)
dahan
2019-06-18
2. “生产环境我们建议使用fabric ca全面管理证书”,byfn.sh 的 generateCerts 函数用 cryptogen 生成证书,此时 docker 还没有把 fabric 网络启动起来,如果用 fabric-ca,那怎么来生成最初的网络拓补,进而启动 fabric 网络?
dahan
2019-06-18
大神你好,对于“简介”里的几句话我有几处不明白。1. “cryptogen实际是辅助测试工具,默认不同orderer,org都有不同的CA”,是否在暗示生产环境下CA是有重复的?
dahan
2019-06-18
cryptogen实际是辅助测试工具,默认不同orderer,org都有不同的CA, 如果一个org要追加个peer或user, cryptogen就不管用了。生产环境我们建议使用fabric ca全面管理证书,
dahan
2019-06-18
大神你好,对于简介里:“ cryptogen实际是辅助测试工具,默认不同orderer,org都有不同的CA, 如果一个org要追加个peer或user, cryptogen就不管用了。生产环境我们建议使用fabric ca全面管理证书,”
其他心得
Zealot · 212天前 
1.简介 Fabric CA基于开源项目CFSSL开发, 主要为fabric网络提供PKI证书服务,是MSP生成的基础。可能有人会问, 官方不是有cryptogen工具批量生成MSP吗? cryptogen实际是辅助测试工具,默认不同orderer,org都有不同的CA, 如果一个org要追加个peer或user, cryptogen就不管用了。生产环境我们建议使用fabric ca全面管理证书, 如果想简单来而区块链组织,节点和用户基本不会变, cryptogen也没问题。 2.
Zealot · 109天前 
去年得知蚂蚁金服放出SOFA的部分开源项目, RPC部分号称源于阿里内部的HSF, HSF当年可是把dubbo 1.x踢出局的, 只是没想到京东改造dubbo为JSF, 当当改为dubbox。国内蛮多电商公司实施服务化就直接上dubbo 1.x或dubbox。这应该是阿里没想到的, 所以现在dubbo 2.x又回笼为apache的顶级项目, 把dubbox合并还继续完善。 朋友说他们公司花了千万买了SOFA的商业版, 那么值钱的东西今天抽空过了一下开源部分的SOFAStack和dubbo2.x文档
Zealot · 118天前 
Fabric 1.4.1引入Raft排序服务, 运维界比较出名的etcd实现的orderer服务。后生可畏, etcd是中国一个年轻人的作品, 实现了raft协议, 在k8s等容器化, 虚拟化, 集群化有官方应用。etcd也是go语言编写, fabric开窍了, 直接把etcd和orderer整合了, 相比kafka/zookeeper的排序服务,搭建简单多了,也比kafka这些省了很多资源(kafka默认开的堆是2GB..), 所以个人是强烈推荐使用,尽量出来不久,但在1.4LTS维护,
Luoying web framework Luoying web framework contains a bundle of components to accelerate J2EE development Github地址 https://github.com/zealzeng/luoying-web Maven地址 <dependency> <groupId>com.whlylc</groupId> <artifac
Zealot · 126天前 
Hyperledger Fabric v2.0 Alpha引入两大新功能,新的Fabric链码生命周期和FabToken. 新的链码生命周期 2.0支持链码的去中心化的治理,引入新的流程在节点上安装链码,在通道上启动实例。新的链码生命周期允许多个组织对链码的参数协同达成一致,例如链码的背书策略。新的模型的改进点如下: (1) 多个组织必须确认同意链码的参数 1.x版本里,一个组织拥有修改链码参数的能力,例如修改背书策略,通道的其它成员也被同步而更改。新的链码生命周期更灵活一些,它兼容支