fabric1.1 ca集成

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/ASN_forever/article/details/88989756

目录

1.初始化ca服务

2.修改配置文件fabric-ca-server-config.yaml

3.启动fabric-ca-server

 4.enroll管理员账号

5.register一个普通角色账号

6.enroll账号

7.复制管理员签名和公用TLS证书文件 

8.将usertest用户的msp文件和tls文件复制到org1下

9.检验usertest身份是否可用

遇到的坑

参考文献


在此之前需要先安装fabric-ca,具体的安装过程比较简单,这里不再赘述,直接从初始化fabric-ca开始。

在此之前,有两个单词需要了解一下,register和enroll,这两个单词都具有登记和注册的意思。我网上查了一下,对登记和注册的区别也没有明确的解释。为了逻辑清晰一点,本文将register翻译为注册,将enroll翻译为登记。这两个步骤的作用如下:

  • 注册(register):根据提供的用户名、密码、用户类型和组织关系等属性注册一个用户账号,此时只会将新用户的信息保存到ca-server中,而不会在本地生成对应的msp
  • 登记(enroll):登记有的地方翻译成载入,就是根据register过的用户信息生成其msp,并将msp加载到本地

1.初始化ca服务

在server启动之前,需要至少有一个自我认证的身份存在,初始化的过程主要会创建这个自我认证的管理员身份以及相关配置文件。初始化ca的命令为fabric-ca-server init -b admin:adminpw,-b参数后面的是fabric-ca-server服务器管理账号的用户名和密码,因为很多资料都使用这个用户名和密码作为示例,因此为了避免猜测用户名和密码进而做出恶意行为,建议替换成较为复杂的用户名和密码。初始化后会在当前目录下生成多个配置文件,其中fabric-ca-server-config.yaml文件会在下一步用到。

[root@slave3 fabric-ca]# fabric-ca-server init -b admin:adminpw
2019/04/02 08:59:34 [INFO] Created default configuration file at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/fabric-ca-server-config.yaml
2019/04/02 08:59:34 [INFO] Server Version: 1.1.1-snapshot-e656889
2019/04/02 08:59:34 [INFO] Server Levels: &{Identity:1 Affiliation:1 Certificate:1}
2019/04/02 08:59:34 [INFO] generating key: &{A:ecdsa S:256}
2019/04/02 08:59:34 [INFO] encoded CSR
2019/04/02 08:59:34 [INFO] signed certificate with serial number 241202165129828050695492207434122912353894482632
2019/04/02 08:59:34 [INFO] The CA key and certificate were generated for CA 
2019/04/02 08:59:34 [INFO] The key was stored by BCCSP provider 'SW'
2019/04/02 08:59:34 [INFO] The certificate is at: /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/ca-cert.pem
2019/04/02 08:59:34 [INFO] Initialized sqlite3 database at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/fabric-ca-server.db
2019/04/02 08:59:34 [INFO] Home directory for default CA: /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca
2019/04/02 08:59:34 [INFO] Initialization was successful
[root@slave3 fabric-ca]# ll
总用量 60
-rw-r--r-- 1 root root   786 4月   2 08:59 ca-cert.pem//自我认证的证书文件
-rw-r--r-- 1 root root 15890 4月   2 08:59 fabric-ca-server-config.yaml//服务配置文件
-rw-r--r-- 1 root root 40960 4月   2 08:59 fabric-ca-server.db//数据库文件(数据库选择sqlite3时有效)
drwxr-xr-x 3 root root    22 4月   2 08:59 msp//自我认证的私钥文件目录

2.修改配置文件fabric-ca-server-config.yaml

为了将fabric-ca与具体的组织绑定到一起,进而实现动态管理相应组织的节点账号,包括新注册一个账号,吊销一个账号等,需要修改初始化时生成的fabric-ca-server-config.yaml配置文件。只需要修改其中的ca部分即可,ca部分是ca服务器的相关属性配置,包含发布证书的组织机构的名称和相关的证书文件路径,具体修改如下:

ca:
  # 这个CA的名字,如果有多个CA服务器,则名字不能重复
  name: ca-org1
  # 私钥文件 (只用来将私钥导入给BCCSP)
  keyfile: /opt/gopath/src/github.com/hyperledger/fabric/scf/crypto-config/peerOrganizations/org1.scf.com/ca/c4802063f536246be3a186b21c12c9b9b2e25a546480a1303de455528b8da348_sk
  # 证书文件(default: ca-cert.pem)
  certfile: /opt/gopath/src/github.com/hyperledger/fabric/scf/crypto-config/peerOrganizations/org1.scf.com/ca/ca.org1.scf.com-cert.pem
  # 证书链文件
  chainfile:

通过以上配置,就将fabric-ca-server绑定到组织org1中了。 

3.启动fabric-ca-server

使用命令fabric-ca-server start -b admin:adminpw启动服务,启动服务后会在前台运行,因此需要另外打开一个终端进行后续操作。

[root@slave3 fabric-ca]# fabric-ca-server start -b admin:adminpw
2019/04/02 09:03:31 [INFO] Configuration file location: /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/fabric-ca-server-config.yaml
2019/04/02 09:03:31 [INFO] Starting server in home directory: /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca
2019/04/02 09:03:31 [INFO] Server Version: 1.1.1-snapshot-e656889
2019/04/02 09:03:31 [INFO] Server Levels: &{Identity:1 Affiliation:1 Certificate:1}
2019/04/02 09:03:31 [INFO] The CA key and certificate files already exist
2019/04/02 09:03:31 [INFO] Key file location: /opt/gopath/src/github.com/hyperledger/fabric/scf/crypto-config/peerOrganizations/org1.scf.com/ca/c4802063f536246be3a186b21c12c9b9b2e25a546480a1303de455528b8da348_sk
2019/04/02 09:03:31 [INFO] Certificate file location: /opt/gopath/src/github.com/hyperledger/fabric/scf/crypto-config/peerOrganizations/org1.scf.com/ca/ca.org1.scf.com-cert.pem
2019/04/02 09:03:31 [INFO] Initialized sqlite3 database at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/fabric-ca-server.db
2019/04/02 09:03:31 [INFO] Home directory for default CA: /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca
2019/04/02 09:03:31 [INFO] Listening on http://0.0.0.0:7054

 4.enroll管理员账号

在初始化的时候已经完成自证身份的管理员账号密码的生成工作,现在需要利用管理员的账号密码获取msp证书文件,以便在以后使用管理员账号来注册新的角色或新的管理员。

首先创建了一个目录用来存储fabric-ca-client的账号文件(msp),这个目录为$PWD/fabric-client:

[root@slave3 fabric-ca]# mkdir fabric-client
[root@slave3 fabric-ca]# ll
总用量 60
-rw-r--r-- 1 root root   786 4月   2 08:59 ca-cert.pem
-rw-r--r-- 1 root root 16186 4月   2 09:01 fabric-ca-server-config.yaml
-rw-r--r-- 1 root root 40960 4月   2 09:03 fabric-ca-server.db
drwxr-xr-x 2 root root     6 4月   2 09:05 fabric-client
drwxr-xr-x 3 root root    22 4月   2 08:59 msp

接下来配置客户端环境变量:

[root@slave3 fabric-ca]# export FABRIC_CA_CLIENT_HOME=$PWD/fabric-client/

最后使用命令 fabric-ca-client enroll -u http://admin:adminpw@localhost:7054 完成管理员账号的登记。

[root@slave3 fabric-ca]# fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
2019/04/02 09:08:27 [INFO] Created a default configuration file at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/fabric-client/fabric-ca-client-config.yaml
2019/04/02 09:08:27 [INFO] generating key: &{A:ecdsa S:256}
2019/04/02 09:08:27 [INFO] encoded CSR
2019/04/02 09:08:27 [INFO] Stored client certificate at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/fabric-client/msp/signcerts/cert.pem
2019/04/02 09:08:27 [INFO] Stored root CA certificate at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/fabric-client/msp/cacerts/localhost-7054.pem
2019/04/02 09:08:27 [INFO] Stored intermediate CA certificates at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/fabric-client/msp/intermediatecerts/localhost-7054.pem

命令执行后会在指定的目录即$PWD/fabric-client下生成以下几个文件:

[root@slave3 fabric-ca]# ll fabric-client/
总用量 8
-rwxr-xr-x 1 root root 6505 4月   3 02:24 fabric-ca-client-config.yaml
drwx------ 6 root root   79 4月   3 02:24 msp
[root@slave3 fabric-ca]# ll fabric-client/msp/
总用量 0
drwxr-xr-x 2 root root 32 4月   3 02:24 cacerts
drwxr-xr-x 2 root root 32 4月   3 02:24 intermediatecerts
drwx------ 2 root root 81 4月   3 02:24 keystore
drwxr-xr-x 2 root root 22 4月   3 02:24 signcerts

5.register一个普通角色账号

管理员账号已经enroll完成了,那么就可以使用管理员身份来登记注册新的用户了。这里register一个用户名为usertest,密码为123456的账号。register命令是用来生成用户账户和密码的(密码可以自己指定也可以自动生成)

[root@slave3 fabric-ca]# fabric-ca-client register --id.name usertest --id.type user --id.affiliation org1.department1 --id.secret 123456 -u http://localhost:7054
2019/04/02 09:12:28 [INFO] Configuration file location: /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/fabric-client/fabric-ca-client-config.yaml
Password: 123456

6.enroll账号

根据上一步生成的usertest用户的账号和密码生成对应的证书和密钥文件(msp文件):

[root@slave3 fabric-ca]# mkdir user
[root@slave3 fabric-ca]# ll
总用量 60
-rw-r--r-- 1 root root   786 4月   2 08:59 ca-cert.pem
-rw-r--r-- 1 root root 16186 4月   2 09:01 fabric-ca-server-config.yaml
-rw-r--r-- 1 root root 40960 4月   2 09:12 fabric-ca-server.db
drwxr-xr-x 6 root root   115 4月   2 09:08 fabric-client
drwxr-xr-x 3 root root    22 4月   2 08:59 msp
drwxr-xr-x 2 root root     6 4月   2 09:14 user

接下来进入创建的user目录,执行enroll登记usertest账号(enroll命令会为usertest用户生成msp的私钥和证书),并将登记成功的账号的相关文件保存到指定目录$PWD/msp(会自动创建msp目录):

[root@slave3 user]# fabric-ca-client enroll -u http://usertest:123456@localhost:7054 -M $PWD/msp
2019/04/02 09:16:39 [INFO] generating key: &{A:ecdsa S:256}
2019/04/02 09:16:39 [INFO] encoded CSR
2019/04/02 09:16:39 [INFO] Stored client certificate at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/user/msp/signcerts/cert.pem
2019/04/02 09:16:39 [INFO] Stored root CA certificate at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/user/msp/cacerts/localhost-7054.pem
2019/04/02 09:16:39 [INFO] Stored intermediate CA certificates at /opt/gopath/src/github.com/hyperledger/fabric/scf/fabric-ca/user/msp/intermediatecerts/localhost-7054.pem

命令执行完之后可以看到在$PWD/msp目录下生成了以下文件,包括usertest用户的私钥和证书等文件:

[root@slave3 user]# ll msp/
总用量 0
drwxr-xr-x 2 root root 32 4月   2 09:16 cacerts
drwxr-xr-x 2 root root 32 4月   2 09:16 intermediatecerts
drwx------ 2 root root 81 4月   2 09:16 keystore
drwxr-xr-x 2 root root 22 4月   2 09:16 signcerts

对于register和enroll过程来说,都会在默认的sqlite数据库(即初始化ca时生成的fabric-ca-server.db数据库文件)中生成相关数据。 可以通过如下方式查看数据库文件的内容(下面的数据库是我后来操作的,因此跟本文前述过程内容不匹配,在这里只是演示查看过程):

[root@slave3 fabric-ca]# sqlite3 fabric-ca-server.db //打开数据库文件
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table //查询当前数据库有哪些表
affiliations  certificates  properties    users       
sqlite> select * from users; //查看users表内信息
adminasn|$2a$10$.f8wMqU/mCiF5Ym1hbYub.0BqUG6JADTSlqgsZewGPO5ynzF0YugC|client||[{"name":"hf.Registrar.Roles","value":"peer,orderer,client,user"},{"name":"hf.Registrar.DelegateRoles","value":"peer,orderer,client,user"},{"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"}]|4|-1|1
usertest|$2a$10$guPJjG3dlQTBttQJ0ALQ5el7r13WaoAKqaxIShYQCovY31moH/3IC|user|org1.department1|[{"name":"hf.EnrollmentID","value":"usertest","ecert":true},{"name":"hf.Type","value":"user","ecert":true},{"name":"hf.Affiliation","value":"org1.department1","ecert":true}]|1|-1|1
usertest2|$2a$10$x0dzU5jGr.w/T1a/YB1S7exAu3NBvbop6vgPPbrP/NbdocEf01HzC|user|org1.department1|[{"name":"hf.EnrollmentID","value":"usertest2","ecert":true},{"name":"hf.Type","value":"user","ecert":true},{"name":"hf.Affiliation","value":"org1.department1","ecert":true}]|0|-1|1
sqlite> 

7.复制管理员签名和公用TLS证书文件 

首先在 $PWD/msp目录下创建文件夹admincerts,用来存放管理员签名文件,之后将签名文件复制过来即可(我参照深蓝大佬的博客,将usertest自己的signcerts下的cert.pem复制过来也可以):

[root@slave3 msp]# mkdir admincerts
[root@slave3 msp]# cp /opt/gopath/src/github.com/hyperledger/fabric/scf/crypto-config/peerOrganizations/org1.scf.com/users/Admin\@org1.scf.com/msp/signcerts/* admincerts/

然后类似的操作,在  $PWD目录下创建文件夹tls,用来存放TLS证书文件,之后将TLS证书文件复制过来即可:

[root@slave3 user]# mkdir tls
[root@slave3 user]# cp /opt/gopath/src/github.com/hyperledger/fabric/scf/crypto-config/peerOrganizations/org1.scf.com/peers/peer0.org1.scf.com/tls/* tls/

这时user目录的结构是下面这样的:

[root@slave3 user]# tree -L 5
.
├── msp
│   ├── admincerts
│   │   └── [email protected]
│   ├── cacerts
│   │   └── localhost-7054.pem
│   ├── intermediatecerts
│   │   └── localhost-7054.pem
│   ├── keystore
│   │   └── 6bbf21a901e90fa6e4928c78983a3fc13dee644fdd490743be0c8acb10e6ecc8_sk
│   └── signcerts
│       └── cert.pem
└── tls
    ├── ca.crt
    ├── server.crt
    └── server.key

8.将usertest用户的msp文件和tls文件复制到org1下

首先在/opt/gopath/src/github.com/hyperledger/fabric/scf/crypto-config/peerOrganizations/org1.scf.com/users/目录下创建一个新的文件夹testuser,用来存放testuser用户的证书和密钥等文件,然后将上一步user目录下的msp和tls两个文件夹拷贝过来。

[root@slave3 ~]# cd /opt/gopath/src/github.com/hyperledger/fabric/scf/crypto-config/peerOrganizations/org1.scf.com/users/
[root@slave3 users]# ll
总用量 0
drwxr-xr-x 4 root root 28 3月   2 19:49 [email protected]
drwxr-xr-x 4 root root 28 4月   2 10:30 testuser
drwxr-xr-x 4 root root 28 3月   2 19:49 [email protected]
drwxr-xr-x 4 root root 28 3月   2 19:49 [email protected]
drwxr-xr-x 4 root root 28 3月   2 19:49 [email protected]
drwxr-xr-x 4 root root 28 3月   2 19:49 [email protected]

9.检验usertest身份是否可用

之后便可以在cli中切换CORE_PEER_MSPCONFIGPATH变量来使用usertest的身份进行链码操作了。我这里的配置如下:

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.scf.com/users/testuser/msp/

接下来为了验证当前用户,编写了一个链码来实现,链码直接从深蓝大佬那copy过来:

package main

import (
   "github.com/hyperledger/fabric/core/chaincode/shim"
   pb "github.com/hyperledger/fabric/protos/peer"
   "fmt"
   "encoding/pem"
   "crypto/x509"
   "bytes"
)

type SimpleChaincode struct {
}

func main() {
   err := shim.Start(new(SimpleChaincode))
   if err != nil {
      fmt.Printf("Error starting Simple chaincode: %s", err)
   }
}
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
   return shim.Success(nil)
}


func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
   function, args := stub.GetFunctionAndParameters()
   fmt.Println("invoke is running " + function)
   if function == "cert" {//自定义函数名称
      return t.testCertificate(stub, args)//定义调用的函数
   }
   return shim.Error("Received unknown function invocation")
}
func (t *SimpleChaincode) testCertificate(stub shim.ChaincodeStubInterface, args []string) pb.Response{
   creatorByte,_:= stub.GetCreator()
   certStart := bytes.IndexAny(creatorByte, "-----")// Devin:I don't know why sometimes -----BEGIN is invalid, so I use -----
   if certStart == -1 {
      fmt.Errorf("No certificate found")
   }
   certText := creatorByte[certStart:]
   bl, _ := pem.Decode(certText)
   if bl == nil {
      fmt.Errorf("Could not decode the PEM structure")
   }
   fmt.Println(string(certText))
   cert, err := x509.ParseCertificate(bl.Bytes)
   if err != nil {
      fmt.Errorf("ParseCertificate failed")
   }
   fmt.Println(cert)
   uname:=cert.Subject.CommonName
   fmt.Println("Name:"+uname)
   return shim.Success([]byte("Called testCertificate "+uname))
}

之后在/opt/gopath/src/github.com/hyperledger/fabric/scf/chaincode/go目录下新建test1cc文件夹用来存放上述链码,上述链码用test1.go命名保存。

如果还没有启动fabric网络的话,现在需要启动网络(因为前面启动了ca服务,所以可能会出现端口占用的情况,可以先杀死进程后再通过docker-peer.yaml启动,当然这个启动文件应该跟你的不同)。启动后进入cli,执行CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.scf.com/users/testuser/msp/设置msp,安装和实例化test1.go链码,其中实例化代码如下:

peer chaincode instantiate -o orderer.scf.com:7050 -C mychannel -n test1cc -v 1.0 -c '{"Args":[]}'

 然后调用链码peer chaincode invoke -C mychannel -n test1cc -c '{"Args":["cert"]}',执行后可以看到如下结果说明可以使用这个身份了:

总结

通过fabric-ca生成新用户的过程可以分为三个步骤:

  1. 登记管理员用户(因为只有管理员才具备用户信息的操作权)
  2. 注册(register)新用户
  3. 登记(enroll)新用户

根据参考文献1的博客,发现确实存在当登记完一个新用户之后,就不能再次注册登记新用户了。会提示下面这种错误:

2019/04/03 19:19:33 [INFO] Configuration file location: /root/.fabric-ca-client/fabric-ca-client-config.yaml
Error: Response from server: Error Code: 20 - Authorization failure

文献1的解释如下:

在认证身份的时候会把之前已经存在的所有配置文件(包括client配置文件,client证书文件,client私钥文件,根证书文件)都重新写掉,文档上说可以通过命令行指定不同的文件名,但是经过试验好像不灵,不知道这是我使用上的问题,还是程序bug。所以在我们例子中当完成用户tester的认证之后,本地的证书信息就被覆盖成tester的了,此时再进行用户登记操作就会失败,因为本地用户已经是tester了,而不是最初的自证管理员了,而tester用户不具有登记用户的权限。办法就是重新认证自证管理员身份。

本篇博客只记录了如何将现有fabric网络绑定到fabric-ca中,操作方式都是基于cli命令行的方式,实际项目中更多的是客户端程序通过fabric-ca-server提供的RESTAPI接口完成账号注册、账号登记等操作。后面会记录一个通过客户端调用SDK访问fabric-ca-server服务器的操作过程。

遇到的坑

1.在第11步修改CORE_PEER_MSPCONFIGPATH变量时,需要将其改为容器中对应的路径,否则会报错如下:

2019-04-02 06:34:29.329 UTC [main] main -> ERRO 001 Cannot run peer because cannot init crypto, missing /opt/gopath/src/github.com/hyperledger/fabric/scf/crypto-config/peerOrganizations/org1.scf.com/users/testuser/msp/ folder

2.新的用户应该在对应的组织环境下操作,也就是哪个组织的ca生成的新用户,就应该在对应组织的环境下使用新用户。比如这里将ca绑定到了org1然后生成的新用户usertest,因此如果在org2组织环境下使用usertest账号(也就是将CORE_PEER_MSPCONFIGPATH配置为usertest的msp)进行链码调用的话,就会报错。cli错误显示如下:

root@4387e24ca6b9:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -C mychannel -n example02cc -c '{"Args":["query","a"]}'
2019-04-02 23:31:21.248 UTC [msp] getPemMaterialFromDir -> WARN 001 Failed reading file /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.scf.com/users/testuser/msp/intermediatecerts/localhost-7054.pem: no pem content for file /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.scf.com/users/testuser/msp/intermediatecerts/localhost-7054.pem
2019-04-02 23:31:21.288 UTC [msp] GetLocalMSP -> DEBU 002 Returning existing local MSP
2019-04-02 23:31:21.288 UTC [msp] GetDefaultSigningIdentity -> DEBU 003 Obtaining default signing identity
2019-04-02 23:31:21.288 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default escc
2019-04-02 23:31:21.288 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 005 Using default vscc
2019-04-02 23:31:21.289 UTC [chaincodeCmd] getChaincodeSpec -> DEBU 006 java chaincode disabled
2019-04-02 23:31:21.289 UTC [msp/identity] Sign -> DEBU 007 Sign: plaintext: 0AB8090A6E08031A0C08C9E18FE50510...303263631A0A0A0571756572790A0161 
2019-04-02 23:31:21.289 UTC [msp/identity] Sign -> DEBU 008 Sign: digest: FA61A0EB2EF70FBAEF87ED4F957D4086A5DAB47E33A14F8B7EFA05E71F9843A2 
Error: Error endorsing query: rpc error: code = Unknown desc = access denied: channel [mychannel] creator org [SupplyOrg2MSP] - <nil>

对应的peer节点(因为环境错误的设为了org2的环境)日志信息如下:

peer0.org2.scf.com    | 2019-04-02 23:31:21.293 UTC [endorser] ProcessProposal -> DEBU 16b5 Entering: Got request from 172.18.0.10:60290
peer0.org2.scf.com    | 2019-04-02 23:31:21.293 UTC [protoutils] ValidateProposalMessage -> DEBU 16b6 ValidateProposalMessage starts for signed proposal 0xc42036fe00
peer0.org2.scf.com    | 2019-04-02 23:31:21.293 UTC [protoutils] validateChannelHeader -> DEBU 16b7 validateChannelHeader info: header type 3
peer0.org2.scf.com    | 2019-04-02 23:31:21.293 UTC [protoutils] checkSignatureFromCreator -> DEBU 16b8 begin
peer0.org2.scf.com    | 2019-04-02 23:31:21.294 UTC [protoutils] ValidateProposalMessage -> WARN 16b9 channel [mychannel]: MSP error: the supplied identity is not valid: x509: certificate signed by unknown authority
peer0.org2.scf.com    | 2019-04-02 23:31:21.298 UTC [endorser] ProcessProposal -> DEBU 16ba Exit: request from%!(EXTRA string=172.18.0.10:60290)

可以看到,peer节点容器日志显示的更清楚,意思是提供的身份无效,因为是被一个未知的authority(因为使用的是org1签名的,所有对org2来说未知)签名的。

参考文献

1.https://www.jianshu.com/p/2159f9043102

2.https://www.cnblogs.com/studyzy/p/7482451.html

3.《区块链开发实战——hyperledger fabric关键技术与案例分析》

猜你喜欢

转载自blog.csdn.net/ASN_forever/article/details/88989756
今日推荐