单个fabric-ca-server启动多个CA服务

单个fabric-ca-server启动多个CA服务

这是一个神奇的功能,至今也不知道这到底有什么用处。

这里只是记录有这么一个功能,以及如何使用这个功能。

要使用多CA服务的功能,有两种设定方法,

  • 一种是设定cacount
  • 另一种是设定cafiles

不管哪种方式最终功能都类似。

下面只以设定cacount为例。

  1. 第一步1: 初始化ca-server
$ fabric-ca-server init -b admin:adminpw --cacount 2

会创建三套配置文件:父ca-server和两个子ca-server:

├── ca
│   ├── ca1
│   │   ├── ca-cert.pem
│   │   ├── fabric-ca-config.yaml
│   │   ├── fabric-ca-server_ca1.db
│   │   └── msp
│   │       └── keystore
│   │           └── 2c9210cf9314e0fff4a5ec9a21c50c98389a7b0c2b54518f7af42924e9ffdaca_sk
│   └── ca2
│       ├── ca-cert.pem
│       ├── fabric-ca-config.yaml
│       ├── fabric-ca-server_ca2.db
│       └── msp
│           └── keystore
│               └── d90879147e7dd56a1599ddb541a59c4e35aaec9dcb0076cece6d67eb522ba6c1_sk
├── ca-cert.pem
├── fabric-ca-server-config.yaml
├── fabric-ca-server.db
└── msp
    └── keystore
        └── 069d21d538b6ddb297abc7beb6110b91427cb27e42004a1d2a54bd9f7c785ad3_sk

两个子ca-server的配置分别在ca/ca1和/ca/ca2目录下面。

比较两个个子ca-server配置的差异,主要是名字不一样。

ca/ca1/fabric-ca-config.yaml                     |  ca/ca2/fabric-ca-config.yaml
-------------------------------------------------+---------------------------------------
ca:                                              |  ca:
    # Name of this CA                            |    # Name of this CA
    name: ca1                                    |    name: ca2                                                                                

子ca-server里面关于公共的部分都存储在父ca-server的配置文件里面,例如监听端口这些。

  1. 第二步,启动ca-server
$ fabric-ca-server start

启动了一个进程,监听在一个端口,提供给三个ca-server使用。

这三个ca-server有什么关系呢?
答:什么关系也没有,各管各的。各自生产各自的根证书,各自完成自签名,也不共享根证书。
这就是我的主要疑问,要这单个fabric-ca-server启动多个CA服务的功能有什么用???

  1. 第三步,使用ca-server

不管他有什么用处吧,我们只管怎么用就好了。
和单个的ca-server一样使用,差别只是需要在命令行指定 --caname表示访问哪一个ca-server,如果没有指定,则是访问父ca-server

enroll bootstrap用户

$ fabric-ca-client enroll --home ca0admin --url http://admin:adminpw@localhost:7054
$ fabric-ca-client enroll --home ca1admin --url http://admin:adminpw@localhost:7054 --caname ca1
$ fabric-ca-client enroll --home ca2admin --url http://admin:adminpw@localhost:7054 --caname ca2

注册新用户

$ fabric-ca-client register --home ca0admin --id.name tester00 --id.secret testpasswd --id.type user --id.affiliation org1.department2
$ fabric-ca-client register --home ca1admin --id.name tester01 --id.secret testpasswd --id.type user --id.affiliation org1.department2 --caname ca1
$ fabric-ca-client register --home ca2admin --id.name tester02 --id.secret testpasswd --id.type user --id.affiliation org1.department2 --caname ca2

enroll新用户

$ fabric-ca-client enroll   --home tester00 -u http://tester00:testpasswd@localhost:7054
$ fabric-ca-client enroll   --home tester01 -u http://tester01:testpasswd@localhost:7054 --caname ca1
$ fabric-ca-client enroll   --home tester02 -u http://tester02:testpasswd@localhost:7054 --caname ca2

如果没有指定指定caname错误,那么访问就会失败,例如:

fabric-ca-client enroll   --home tester01 -u http://tester02:testpasswd@localhost:7054 --caname ca1
2018/05/17 15:03:29 [INFO] generating key: &{A:ecdsa S:256}
2018/05/17 15:03:29 [INFO] encoded CSR
Error: Response from server: Error Code: 20 - Authorization failure

因为用户tester02根本不在ca1里面,tester02是注册到ca2里面的。

我们在进到CAserver内部,可以看CA里面的数据库:

$ sqlite3 ca/ca1/fabric-ca-server_ca1.db 
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from users;
admin|$2a$10$9R3vlQ7Qz6XfO2PaB6.lfOMMKyMVzg0lna/8wFvqEdJFTMES7xeUq|client||[{"name":"hf.Revoker","value":"1"},{"name":"hf.IntermediateCA","value":"1"},{"name":"hf.GenCRL","value":"1"},{"name":"hf.Registrar.Attributes","value":"*"},{"name":"hf.AffiliationMgr","value":"1"},{"name":"hf.Registrar.Roles","value":"peer,orderer,client,user"},{"name":"hf.Registrar.DelegateRoles","value":"peer,orderer,client,user"}]|2|-1|1
tester01|$2a$10$6qylJvSlC7UziAF8MfD26OHMLbk9oo5L7Bj2Q6hh/seZJGlbG6f2C|user|org1.department2|[{"name":"hf.EnrollmentID","value":"tester01","ecert":true},{"name":"hf.Type","value":"user","ecert":true},{"name":"hf.Affiliation","value":"org1.department2","ecert":true}]|0|-1|1
sqlite> 

在ca1的数据库里面只有admin和tester01两个用户名,而没有tester00和tester02的用户;其他两个ca-server也一样。

你可能感兴趣的:(单个fabric-ca-server启动多个CA服务)