Hyperledger Fabric:实现链代码级别的访问控制

Hyperledger Fabric: implementing chaincode level access control

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

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

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

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

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

我的问题是官方文档中提供的解决方案描述了使用 "client identity (cid) library"(https://github.com/hyperledger/fabric/tree/master/core/chaincode/shim/ext/cid) 从证书中提取用户信息的可能性。但就我而言,我在 Java 和 Java 脚本中有链代码,并且(我认为)我只能使用 GetCreator() 方法,该方法将用户证书作为字节数组输出。

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

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();
        }

我也在找这个功能,不过现在好像已经添加了。 FAB-15895 added ClientIdentity.java to Java chaincode (see commit),它允许查询证书信息。预计它会成为 Fabric 下一个版本的一部分 - v1.4.4。