我可以为我的超级账本结构用户使用现有证书、私钥、公钥,而不是从 CA 或 cryptogen 创建新的证书吗?



我正在开发Hyperledger fabric 1.0 beta版本。到目前为止,我已经注意到,如果使用 Node sdk 在对等节点上完成交易,它会在内部向 CA 发送调用以获取新用户的加密材料(证书、私钥、公钥(。如果我已经有用户证书、私钥、公钥,我如何使用它们向对等方发送请求,而不是使用 CA 提供的加密材料。 我注意到Cryptogen实用程序还为用户生成加密工件。如何使用这些工件在对等节点上进行交易,而不是先调用 CA?

请分享一下如何在 GO SDK 中解决这个问题。我可以移动到 GO 必要时应用层。

func TestExample(t *testing.T) {
conf, err := config.InitConfig("config.yaml")
assert.NoError(t, err)
cl := fabricclient.NewClient(conf)
bccspFactory.InitFactories(nil)
cryptoSuite := bccspFactory.GetDefault()
privKey := "/home/yacovm/fabricDeployment/crypto-config/peerOrganizations/hrl.ibm.il/users/Admin@hrl.ibm.il/msp/keystore/213d24d189babc01e1f2e4e4cc2fd1a68bcfe95a2bdd0981ef2f9c39a00fb3f2_sk"
pubKey := "/home/yacovm/fabricDeployment/crypto-config/peerOrganizations/hrl.ibm.il/users/Admin@hrl.ibm.il/msp/signcerts/Admin@hrl.ibm.il-cert.pem"
user ,err := fabapi.NewPreEnrolledUser(conf, privKey, pubKey, "yacov", "PeerOrg", bccspFactory.GetDefault())
cl.SetCryptoSuite(cryptoSuite)
assert.NotNil(t, user)
assert.NoError(t, err)
cl.SetUserContext(user)
o, err := orderer2.NewOrderer("vm1:7050",
"/home/yacovm/fabricDeployment/crypto-config/ordererOrganizations/hrl.ibm.il/orderers/vm1.hrl.ibm.il/tls/ca.crt",
"", conf)
assert.NoError(t, err)
p, err := peer.NewPeerTLSFromCert("vm2:7051", "/home/yacovm/fabricDeployment/crypto-config/peerOrganizations/hrl.ibm.il/peers/vm2.hrl.ibm.il/tls/ca.crt", "", conf)
assert.NoError(t, err)
ch, err := cl.NewChannel("yacov")
ch.AddOrderer(o)
ch.AddPeer(p)
cl.SaveUserToStateStore(user, true)
tp, err := ch.CreateTransactionProposal("exampleCC", "yacov", []string{"invoke", "a", "b", "1"}, true, nil)
assert.NoError(t, err)
assert.NotNil(t, tp)
resp, err := channel.SendTransactionProposal(tp, 1, []apitxn.ProposalProcessor{p})
assert.NoError(t, err)
fmt.Println(string(resp[0].TransactionProposalResult.ProposalResponse.Response.Payload))
txn, err := ch.CreateTransaction(resp)
assert.NoError(t, err)
txnResp, err := ch.SendTransaction(txn)
assert.NoError(t, err)
fmt.Println(txnResp[0])
time.Sleep(time.Second * 5)
tp, err = ch.CreateTransactionProposal("exampleCC", "yacov", []string{"query", "a"}, true, nil)
resp, err = channel.SendTransactionProposal(tp, 1, []apitxn.ProposalProcessor{p})
fmt.Println(string(resp[0].TransactionProposalResult.ProposalResponse.Response.Payload))
}

请参考 fabric 项目中的e2e_cli示例,通过使用脚本 generateArtifacts.sh,您将获得证书文件和创世区块。当您启动节点服务器时,您可以直接从现有文件中读取证书,而不是从 CA 服务器获取证书,实际上您不需要运行 CA 服务器。

最新更新