Hyperledger fabric 尝试访问Hyperledger结构身份提供程序上下文时,角色和从属关系为空

Hyperledger fabric 尝试访问Hyperledger结构身份提供程序上下文时,角色和从属关系为空,hyperledger-fabric,hyperledger-fabric-sdk-js,Hyperledger Fabric,Hyperledger Fabric Sdk Js,我的应用程序流要求我能够检查身份在网络端的角色。当我注册一个新用户时,我通过Fabric CA设置该用户的角色、从属关系等。我设置的角色似乎确实决定了链码调用权限,但我似乎不知道以后如何访问该角色。我尝试从提供者获取用户的上下文,但似乎角色从属关系的字段,甚至注册机密字段都显示为空。我已附上相关代码 我正在使用结构版本2.1的节点SDK 以下是获取用户上下文的代码: const pword = await ca.register({enrollmentID: userName, enrollm

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

我正在使用结构版本2.1的节点SDK

以下是获取用户上下文的代码:

 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示例com”,“Roles”:null,“affiliation”:““enrollmentSecret”:“,”enrollment:”。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(证书,签名密钥…)

结构标识的编码的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

如果您注意到它,那么您会发现
角色
从属关系
注册机密
字段的值要么是
null
要么是
(空字符串)

现在,这只是一个推测,我可能在这方面是错误的,但我认为当我们尝试使用方法
getRoles
getEnrollmentSecret
getAffiliation
获取这些字段的值时,我们会从本地目录或结构存储中的证书中获取值

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

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

我观察到的一件事是,当我们使用openssl实用程序解码任何标识的pem证书时,我们得到了解码后的x509证书

opensslx509-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中也遇到过。现在我不知道这是否是为了避免某些安全缺陷或其他问题而故意采取的行动,但奇怪的是,我从未看到任何结构维护人员对此发表评论


在我的研究中,我发现此人面临着完全相同的问题,但这一点也没有得到回答。

Fabric identity的编码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

如果您注意到它,那么您会发现
角色
从属关系
注册机密
字段的值要么是
null
要么是
(空字符串)

现在,这只是一个推测,我可能在这方面是错误的,但我认为当我们尝试使用方法
getRoles
getEnrollmentSecret
getAffiliation
获取这些字段的值时,我们会从本地目录或结构存储中的证书中获取值

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

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

我观察到的一件事是,当我们使用openssl实用程序解码任何标识的pem证书时,我们得到了解码后的x509证书

opensslx509-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中也遇到过。现在我不知道这是否是为了避免某些安全缺陷或其他问题而故意采取的行动,但奇怪的是,我从未看到任何结构维护人员对此发表评论


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

谢谢你花时间回答。是的,我只是不明白为什么SDK方法什么都不产生。静态读取值是什么意思?我的意思是你必须使用命令
fabric ca client identity list--id identityName
在CA容器中获取有关结构标识的信息。除非您自动执行此操作,否则您必须静态提供id并获取结果,我认为这不是很实际。感谢您花时间回答。是的,我只是不明白为什么有SDK方法不产生任何结果。什么您的意思是静态读取值吗?我的意思是您必须在ca容器内使用命令
fabric ca client identity list--id identityName
,以获取有关