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

时间:2017-07-06 06:03:19

标签: hyperledger hyperledger-fabric

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

2 个答案:

答案 0 :(得分:1)

  

请分享如何在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))
}

答案 1 :(得分:0)

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