1

我的应用程序流程要求我能够在网络端检查身份的角色。当我注册一个新用户时,我通过 Fabric CA 设置该用户的角色、隶属关系等。我设置的角色似乎确实决定了链码调用权限,但我似乎无法弄清楚以后如何访问该角色。我尝试从提供者那里获取用户的上下文,但似乎角色从属关系的字段,甚至是enrollmentSecret 都显示为空。我附上了相关代码。

我正在使用 Node SDK for 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", "roles":null , "affiliation":"" , "enrollmentSecret":"" ,"enrollment":_____ (证书、签名密钥……)

4

1 回答 1

0

Fabric 身份的编码 x509 证书如下所示:

{"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用换行符替换了。

如果您注意到它,那么您会发现 fields roles, affiliation,enrollmentSecret的值要么是要么null""空字符串)。

现在,这只是一个猜测,我可能错了,但我认为当我们尝试使用方法获取这些字段中的任何一个的值时getRolesgetEnrollmentSecret我们getAffiliation会从我们拥有的证书中获取值本地目录或结构存储。

如果它们不提供任何有用的输出,我不知道为什么这些方法甚至首先出现在 SDK 中。

我遇到了一个类似的问题,我试图获取结构标识的enrollmentSecret 值,但得到的输出与您的输出相同,即一个空字符串。您可以在此处看到该线程,但是,我不确定您是否可以从中删除任何内容。

我观察到的一件事是,当我们使用 openssl 实用程序解码任何身份的 pem 证书时,我们得到了解码的 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.affiliationhf.type

现在,除非我们解码 x509 证书并在我们的代码中从证书中读取这些值,否则我认为我们无法获得这些值。当然,如果您只想静态读取值,您可以使用fabric-ca-client实用程序来执行此操作,但我假设这里不是这种情况。

在 SDK v1.4 中也遇到过这个问题。现在我不知道这是否是为了避免一些安全漏洞或其他什么而故意采取的行动,但奇怪的是,我从未见过任何结构维护人员对此发表评论。

在我的研究中,我发现这个人面临完全相同的问题的链接,但这也没有答案。

于 2020-08-07T10:09:33.867 回答