Hyperledger Fabric: реализация контроля доступа на уровне цепочки кодов - PullRequest
2 голосов
/ 04 мая 2019

Я хочу реализовать контроль доступа на уровне цепочки кодов для какого-либо метода. Так, например, я хочу, чтобы вызванный метод цепного кода мог быть выполнен, только если пользователь, выполнивший запрос, имеет идентификатор certein, который соответствует полю актива, запрошенного в состоянии мира.

В https://hyperledger -fabric.readthedocs.io / en / release-1.4 / chaincode4ade.html , официальная документация гласит:

"Цепной код может использовать сертификат клиента (отправителя) для принятия решений по управлению доступом, вызывая функцию GetCreator (). Кроме того, оболочка Go предоставляет API-интерфейсы расширения, которые извлекают идентификационные данные клиента из сертификата отправителя, которые можно использовать для принятия решений по управлению доступом. это основано на самой идентичности клиента, или идентичности организации, или на атрибуте идентичности клиента.

Например, актив, представленный в виде ключа / значения, может включать идентификационную информацию клиента как часть значения (например, атрибут JSON, указывающий на владельца актива), и только этот клиент может быть авторизован для обновления ключ / значение в будущем. API-интерфейсы расширения библиотеки идентификаторов клиентов можно использовать в коде цепи для извлечения этой информации отправителя для принятия таких решений по управлению доступом. "

Это полностью отражает мой случай: мои активы содержат владельца поля, и я хочу, чтобы метод удаления мог выполняться с активом только пользователем, который является владельцем этого актива, т. Е. Если его личность - имя пользователя - совпадает с поле владельца.

Моя проблема заключается в том, что решение, предоставленное в официальной документации, описывает возможность использования «библиотеки идентификаторов клиента (cid)» (https://github.com/hyperledger/fabric/tree/master/core/chaincode/shim/ext/cid)) для извлечения информации о пользователях из сертификата. Но в моем случае у меня есть цепные коды в Java и Javascript, и (я думаю) я могу использовать только метод GetCreator (), который выдает сертификат пользователя в виде массива байтов.

Как я могу извлечь необходимую информацию из сертификата? Является ли это возможным? Можно ли использовать библиотеку CID из моих цепных кодов Java и Javascript?

1 Ответ

1 голос
/ 05 мая 2019

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