3

我想对某些方法实现链码级别的访问控制。因此,例如,我希望调用的链码方法只有在执行请求的用户具有与世界状态中请求的资产字段匹配的特定身份时才能执行。

https://hyperledger-fabric.readthedocs.io/en/release-1.4/chaincode4ade.html,官方文档说:

“Chaincode 可以通过调用 GetCreator() 函数将客户端(提交者)证书用于访问控制决策。此外,Go shim 提供了扩展 API,可从提交者的证书中提取客户端身份,可用于访问控制决策,无论是基于在客户身份本身、组织身份或客户身份属性上。

例如,表示为键/值的资产可能包括客户端的身份作为值的一部分(例如作为指示资产所有者的 JSON 属性),并且只有该客户端可能被授权对键/值进行更新在将来。客户端身份库扩展 API 可在链代码中使用来检索此提交者信息,以做出此类访问控制决策。”

这完美地反映了我的情况:我的资产包含一个字段所有者,我希望只有作为该资产所有者的用户才能对资产执行删除方法,即如果他的身份 - 用户名 - 与所有者字段匹配。

我的问题是官方文档中提供的解决方案描述了使用“客户端身份(cid)库”的可能性(https://github.com/hyperledger/fabric/tree/master/core/chaincode/shim/ext/ cid ) 从证书中提取用户信息。但在我的情况下,我有 Java 和 Javascript 的链码,并且(我认为)我只能使用 GetCreator() 方法,它将用户证书作为字节数组作为输出。

如何从证书中提取我需要的信息?可能吗?是否可以使用我的 Java 和 Javascript 链代码中的 CID 库?

4

2 回答 2

3

CID 库只是一个语法糖包装器,它有助于在链码中使用身份进行操作,本质上是在 GoLang 中完成的操作或提取信息的方式是:


    serializedID, _ := stub.GetCreator()

    sId := &msp.SerializedIdentity{}
    err := proto.Unmarshal(serializedID, sId)
    if err != nil {
        return shim.Error(fmt.Sprintf("Could not deserialize a SerializedIdentity, err %s", err))
    }

    bl, _ := pem.Decode(sId.IdBytes)
    if bl == nil {
        return shim.Error(fmt.Sprintf("Could not decode the PEM structure"))
    }
    cert, err := x509.ParseCertificate(bl.Bytes)
    if err != nil {
        return shim.Error(fmt.Sprintf("ParseCertificate failed %s", err))
    }

    fmt.Println(cert)

这可以在 Java 中按照以下方式完成:

        try {
            Identities.SerializedIdentity identity = Identities.SerializedIdentity.parseFrom(stub.getCreator()); 
            StringReader reader = new StringReader(identity.getIdBytes().toStringUtf8()); 
            PemReader pr = new PemReader(reader); 
            byte[] x509Data = pemReader.readPemObject().getContent();
            CertificateFactory factory = CertificateFactory.getInstance("X509"); 
            X509Certificate certificate = factory.generateCertificate(new ByteArrayInputStream(x509Data));

        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
于 2019-05-04T22:27:46.193 回答
1

我也在寻找这个功能,但是现在似乎已经添加了。FAB-15895将 ClientIdentity.java 添加到 Java 链码(请参阅commit),它允许查询证书以获取信息。期望它成为 Fabric 的下一个版本 - v1.4.4 的一部分。

于 2019-09-04T18:42:03.783 回答