Hyperledger Fabric:Fabric-CA注册用户跨容器调用链码问题
让Fabric CA注册的新用户调用链码的完整解决方案
我来帮你一步步搞定这个问题——在已经用cryptogen初始化的basic-network里,让Fabric CA生成的新用户调用链码其实不难,关键是处理好证书传递和CLI身份配置这两步。
一、证书传递:从Fabric CA到Peer/CLI容器
你问的docker cp是否合规?完全合规,Fabric的证书本质就是文件系统里的加密文件,只要放到正确的路径、权限设置对,Peer和CLI就能识别。当然如果是生产环境,可能会用更自动化的证书分发方式,但测试/演示场景下docker cp足够好用。
具体操作步骤:
- 先从Fabric CA容器导出新用户的证书
- 假设你的CA容器叫
ca.example.com,你登记新用户时如果是在容器内执行的命令,证书默认会存在容器的临时目录或者你指定的路径。先进入CA容器找证书:docker exec -it ca.example.com bash - 比如你登记的用户是
user1,证书目录在/tmp/user1/msp,退出容器后把它复制到本地:docker cp ca.example.com:/tmp/user1/msp ./local-user1-msp
- 假设你的CA容器叫
- 把证书复制到Peer容器
Peer容器的用户MSP需要放在/etc/hyperledger/fabric/msp/users/[用户身份]/msp路径下,比如User1@example.com:
复制完后最好进Peer容器调整权限,避免权限问题:docker cp ./local-user1-msp peer0.example.com:/etc/hyperledger/fabric/msp/users/User1@example.com/mspdocker exec -it peer0.example.com chown -R root:root /etc/hyperledger/fabric/msp/users/User1@example.com/msp - 同步复制到CLI容器
CLI容器的用户MSP路径一般是/opt/gopath/src/github.com/hyperledger/fabric/peer/msp/users/[用户身份]/msp:docker cp ./local-user1-msp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/msp/users/User1@example.com/msp
二、在CLI容器中以新用户身份调用链码
证书放好后,只要在CLI里切换到新用户的身份环境,就能正常调用链码了:
- 进入CLI容器:
docker exec -it cli bash - 配置环境变量,切换到新用户身份:
# 指定新用户的MSP路径 export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/msp/users/User1@example.com/msp # 其他必要的环境变量(和原来的Org配置一致) export CORE_PEER_ADDRESS=peer0.example.com:7051 export CORE_PEER_LOCALMSPID=Org1MSP export CORE_PEER_TLS_ENABLED=true # 如果你的网络开了TLS,记得加上 export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/tls/ca.crt - 验证身份是否生效
先执行一个简单的通道查询,确认能正常连接:
如果能返回你创建的通道(比如peer channel listmychannel),说明身份配置没问题。 - 调用链码
假设你的链码已经部署到mychannel,名字是basic,试试查询或调用:- 查询操作:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}' - 写入操作(需要Orderer节点地址):
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic -c '{"Args":["CreateAsset","asset1","blue","10","Tom","100"]}'
- 查询操作:
三、可选:更高效的证书挂载方式
如果不想每次新增用户都用docker cp,可以在启动CLI容器时,把本地存放用户证书的目录挂载到容器里。比如启动CLI时添加这个参数:
-v /本地路径/user-certificates:/opt/gopath/src/github.com/hyperledger/fabric/peer/msp/users
这样后续新用户的证书直接放到本地user-certificates目录下,CLI容器里就能直接识别,不用再复制了。
最后要注意:新用户的MSP目录结构必须符合Fabric要求——必须包含cacerts(CA根证书)、keystore(用户私钥)、signcerts(用户签名证书)这三个子目录,不然Peer/CLI会识别失败。
内容的提问来源于stack exchange,提问作者Kartik Chauhan
相关产品推荐
相关产品推荐

