При попытке доступа к контексту поставщика удостоверений Hyperledger Fabric роли и принадлежность равны нулю.

Поток моего приложения требует, чтобы я мог проверить роль удостоверения на стороне сети. Когда я регистрирую нового пользователя, я устанавливаю его роль, принадлежность и т. Д. Через Fabric CA. Роль, которую я установил, похоже, действительно определяет права вызова чейнкода, но я не могу понять, как получить доступ к этой роли позже. Я попытался получить контекст пользователя от провайдера, но кажется, что поля для ролевой принадлежности и даже enrollmentSecret имеют нулевое значение. Я приложил соответствующий код.

Я использую Node SDK для Fabric версии 2.1.

Вот мой код для получения контекста пользователя:

 const pword = await ca.register({enrollmentID: userName, enrollmentSecret: password, role: "client", affiliation: "org1.department1"}, adminUser);
            const enrollment = await ca.enroll({enrollmentID: userName, enrollmentSecret: pword});
            const x509Identity = {
                credentials: {
                    certificate: enrollment.certificate,
                    privateKey: enrollment.key.toBytes(),
                },
                mspId: 'org0-example-com',
                type: 'X.509',
            };
            await wallet.put(userName, x509Identity);
            const targ = await wallet.get(userName);
            const user= wallet.getProviderRegistry().getProvider(targ.type);
            const targetUser = await user.getUserContext(targ, userName);
            console.log("Roles are: "+targetUser);

И это соответствующий вывод консоли:

Роли: {name: dave, mspid: org0-example-com, роли: null, affiliation:, enrollmentSecret:, enrollment: _____ (Сертификат, ключ подписи…)


person itochterman    schedule 06.08.2020    source источник


Ответы (1)


Сертификат x509, закодированный для идентификации Fabric, выглядит примерно так:

{"name":"user1","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"3a18bb4555dc58717b0eaf658646ae3fd3cddf67af8b30c22880","identity":{"certificate":"-----BEGIN CERTIFICATE-----
MIICyzCCAnKgAwIBAgIUf52V2QcJWyKi2rK6FSvk/R4xnoIwCgYIKoZIzj0EA
czELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTD
biBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVB
E2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwNzE1MTAzODAwWhcNMjEwNzE1M
MzAwWjBgMS8wDAYDVQQLEwVhZG1pbjALBgNVBAsTBG9yZzEwEgYDVQQLEwtkZ
cnRtZW50MTEtMCsGA1UEAxMkMDAxY2EyYjEtYzY4OC0xMWVhLTk0ODItOWRlZ
MmY3MTQyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhpg1gJvE2pXahJm4d
EerQS3Z6qQ58UvFZx1l6Xa/PMeO/M1n7LUoU4BBFfrai+iH1rGDdkNFhkmfnC
lqOB9jCB8zAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAdBgNVHQ4EF
3j1nyj0qVHWpXHLlhLdrKCV+ek4wKwYDVR0jBCQwIoAg9KIF18lr4q4BA6CIq
qIpfKcbeWbm26XKFOZ5fLNQwgYYGCCoDBAUGBwgBBHp7ImF0dHJzIjp7ImhmL
ZmlsaWF0aW9uIjoib3JnMS5kZXBhcnRtZW50MSIsImhmLkVucm9sbG1lbnRJR
IjAwMWNhMmIxLWM2ODgtMTFlYS05NDgyLTlkZWZmMDJmNzE0MiIsImhmLlR5c
OiJhZG1pbiJ9fTAKBggqhkjOPQQDAgNHADBEAiBURkhpQzHNxEz1OzqAM+eYY
nmiw+bktNnpUEySSZwIgLkcmYhJ2tNTHGMe/ArkcRdyvY2fG8gO/UAU3FKbgD
-----END CERTIFICATE-----
"}}}

Я заменил \n символом новой строки только для ясности.

Если вы заметите это, то обнаружите, что значения полей roles, affiliation, enrollmentSecret равны либо null, либо "" (пустая строка).

Это всего лишь предположение, и я могу ошибаться в этом, но я думаю, что, когда мы пытаемся получить значение любого из этих полей с помощью методов getRoles, getEnrollmentSecret, getAffiliation, мы получаем значение из сертификата, который мы ' в нашем местном каталоге или в магазине тканей.

Я не знаю, почему эти методы вообще включены в SDK, если они не обеспечивают полезного вывода.

Я столкнулся с аналогичной проблемой, когда я пытался получить значение enrollmentSecret идентификатора ткани, но получил тот же результат, что и вы, - пустую строку. Вы можете увидеть эту ветку здесь, но я не уверен, можно ли что-нибудь от него отобрать.

Я заметил одну вещь: когда мы декодируем сертификат pem любого идентификатора с помощью утилиты openssl, мы получаем декодированный сертификат x509.

openssl x509 -in user1 -noout -text

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            3a:2e:95:d9:07:09:5b:22:a2:da:2b:e4:fd:1e:31:9e:82
    Signature Algorithm: ecdsa-with-SHA256
        Issuer: C=US, ST=California, L=San Francisco, O=org1.example.com, CN=ca.org1.example.com
        Validity
            Not Before: Jul 15 10:38:00 2020 GMT
            Not After : Jul 15 10:43:00 2021 GMT
        Subject: OU=admin, OU=org1, OU=department1, CN=user1
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:86:98:35:80:9b:c4:da:95:da:84:99:b8:76:33:
                    b0:11:ea:d0:4b:76:7a:a9:0e:7c:52:f1:59:c7:59:
                    e7:09:6b:0c:96
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                DE:3D:67:CA:3D:84:B7:6B:28:25:7E:7A:4E
            X509v3 Authority Key Identifier:
                keyid:F4:A2:05:14:BF:A8:8A:5F:29:C6:DE:59:B9:B6:E9:72:85:39:9E:5F:2C:D4

            1.2.3.4.5.6.7.8.1:
                {"attrs":{"hf.Affiliation":"org1.department1","hf.EnrollmentID":"user1","hf.Type":"admin"}}
    Signature Algorithm: ecdsa-with-SHA256
         30:44:02:20:54:46:48:69:43:31:cd:c4:4c:f5:3b:3a:80:33:
         02:20:2e:47:26:62:12:76:b4:d4:c7:18:c7:bf:02:b9:1c:45:
         dc:af:63:67:c6:f2:07:14:a6:e0:0f:98

мы можем видеть принадлежность и роль в нотации абстрактного синтаксиса, ASN.1 (1.2.3.4.5.6.7.8.1) в форме hf.affiliation и hf.type соответственно.

Теперь, если мы не декодируем сертификат x509 и не прочитаем эти значения из сертификата в нашем коде, я не думаю, что у нас есть какой-либо способ получить эти значения. Конечно, если вы просто хотите считывать значения статически, вы можете сделать это с помощью утилиты fabric-ca-client, но я предполагаю, что здесь это не так.

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

В своем исследовании я обнаружил, что это ссылка, где человек столкнулся с той же проблемой, но и на нее нет ответа.

person Kartik Chauhan    schedule 07.08.2020
comment
Спасибо, что нашли время ответить. Да, я просто не понимаю, почему существуют методы SDK, которые ничего не производят. Что вы имеете в виду под статическим считыванием значений? - person itochterman; 07.08.2020
comment
Я имею в виду, что вам нужно будет использовать команду fabric-ca-client identity list --id identityName внутри контейнера CA, чтобы получить информацию об идентификаторе фабрики. Если вы не автоматизируете это, вам придется статически предоставлять идентификаторы и получать результат, что, на мой взгляд, не очень практично. - person Kartik Chauhan; 07.08.2020