Hyperledger fabric 在Hyperledger结构CA中为LDAP用户设置管理员角色

Hyperledger fabric 在Hyperledger结构CA中为LDAP用户设置管理员角色,hyperledger-fabric,hyperledger-fabric-ca,Hyperledger Fabric,Hyperledger Fabric Ca,我有一个使用V1.4的Hyperledger Fabric区块链,我通过LDAP连接到组织的Active Directory,我希望能够从我的广告中更改用户的角色 基本上我需要两个角色:用户和管理员,用户可以运行合同,管理员可以安装和升级合同 因此,我试图在fabric-ca-server-config.yaml上的ldap配置中添加一个转换器,并将“memberOf”AD属性更改为hf.register.Roles,如下所示: ldap: url: ldap://CN=USER,DC=OR

我有一个使用V1.4的Hyperledger Fabric区块链,我通过LDAP连接到组织的Active Directory,我希望能够从我的广告中更改用户的角色

基本上我需要两个角色:用户和管理员,用户可以运行合同,管理员可以安装和升级合同

因此,我试图在fabric-ca-server-config.yaml上的ldap配置中添加一个转换器,并将“memberOf”AD属性更改为hf.register.Roles,如下所示:

ldap:
  url: ldap://CN=USER,DC=ORG1,DC=com:password@ldapserver:389/DC=ORG1,DC=com
  userfilter: (userPrincipalName=%s)
  attribute:
      names: ['userPrincipalName','memberOf']
      converters:
        - name: hf.Revoker
          value: attr("userPrincipalName") =~ "revoker*"
        - name: hf.Registrar.Roles
          value: map(attr("memberOf"),"roles")           
      maps:
        roles:
            - name: CN=BC-CLIENT,DC=ORG1,DC=com
              value: client
            - name: CN=BC-USER,DC=ORG1,DC=com
              value: user
            - name: CN=BC-ADMIN,DC=ORG1,DC=com
              value: admin
            - name: CN=BC-PEER,DC=ORG1,DC=com
              value: peer
            - name: CN=BC-ORDERER,DC=ORG1,DC=com
              value: orderer
const ca = new FabricCAServices(caInfo.url, { trustedRoots: caTLSCACerts, verify: false }, caInfo.caName);

const enrollment = await ca.enroll({
    enrollmentID: adminId,
    enrollmentSecret: adminSecret,
});
const identity = X509WalletMixin.createIdentity('Org1MSP', enrollment.certificate, enrollment.key.toBytes());
await wallet.import(adminId, identity);
ldap:
  attribute:
      converters:
        - name: OU
          value: map(attr("memberOf"),"roles")           
到目前为止,一切都很好,我可以像这样使用NodeJ注册用户:

ldap:
  url: ldap://CN=USER,DC=ORG1,DC=com:password@ldapserver:389/DC=ORG1,DC=com
  userfilter: (userPrincipalName=%s)
  attribute:
      names: ['userPrincipalName','memberOf']
      converters:
        - name: hf.Revoker
          value: attr("userPrincipalName") =~ "revoker*"
        - name: hf.Registrar.Roles
          value: map(attr("memberOf"),"roles")           
      maps:
        roles:
            - name: CN=BC-CLIENT,DC=ORG1,DC=com
              value: client
            - name: CN=BC-USER,DC=ORG1,DC=com
              value: user
            - name: CN=BC-ADMIN,DC=ORG1,DC=com
              value: admin
            - name: CN=BC-PEER,DC=ORG1,DC=com
              value: peer
            - name: CN=BC-ORDERER,DC=ORG1,DC=com
              value: orderer
const ca = new FabricCAServices(caInfo.url, { trustedRoots: caTLSCACerts, verify: false }, caInfo.caName);

const enrollment = await ca.enroll({
    enrollmentID: adminId,
    enrollmentSecret: adminSecret,
});
const identity = X509WalletMixin.createIdentity('Org1MSP', enrollment.certificate, enrollment.key.toBytes());
await wallet.import(adminId, identity);
ldap:
  attribute:
      converters:
        - name: OU
          value: map(attr("memberOf"),"roles")           
使用此用户,我可以查询和调用合同,但当我尝试安装合同时,会出现以下错误:

install proposal was bad Error: access denied for [install]: Failed verifying that proposal's creator satisfies local MSP principal during channelless check policy with policy [Admins]: [The identity is not an admin under this MSP [Org1MSP]: The identity does not contain OU [ADMIN], MSP: [Org1MSP]],Error: access denied for [install]: Failed verifying that proposal's creator satisfies local MSP principal during channelless check policy with policy [Admins]: [The identity is not an admin under this MSP [Org1MSP]: The identity does not contain OU [ADMIN], MSP: [Org1MSP]]
我可以看到映射在CA日志中运行良好,但我猜hf.register.Roles不是我需要的属性

我怎样才能做到这一点

谢谢

更新:

我向转换器添加了OU属性,如下所示:

ldap:
  url: ldap://CN=USER,DC=ORG1,DC=com:password@ldapserver:389/DC=ORG1,DC=com
  userfilter: (userPrincipalName=%s)
  attribute:
      names: ['userPrincipalName','memberOf']
      converters:
        - name: hf.Revoker
          value: attr("userPrincipalName") =~ "revoker*"
        - name: hf.Registrar.Roles
          value: map(attr("memberOf"),"roles")           
      maps:
        roles:
            - name: CN=BC-CLIENT,DC=ORG1,DC=com
              value: client
            - name: CN=BC-USER,DC=ORG1,DC=com
              value: user
            - name: CN=BC-ADMIN,DC=ORG1,DC=com
              value: admin
            - name: CN=BC-PEER,DC=ORG1,DC=com
              value: peer
            - name: CN=BC-ORDERER,DC=ORG1,DC=com
              value: orderer
const ca = new FabricCAServices(caInfo.url, { trustedRoots: caTLSCACerts, verify: false }, caInfo.caName);

const enrollment = await ca.enroll({
    enrollmentID: adminId,
    enrollmentSecret: adminSecret,
});
const identity = X509WalletMixin.createIdentity('Org1MSP', enrollment.certificate, enrollment.key.toBytes());
await wallet.import(adminId, identity);
ldap:
  attribute:
      converters:
        - name: OU
          value: map(attr("memberOf"),"roles")           
我可以看到转换是在CA中完成的

Evaluating expression for attribute 'OU' from LDAP user 'user@company.com'
Values for LDAP attribute 'memberOf' are '[CN=BC-CLIENT,DC=ORG1,DC=com CN=BC-USER,DC=ORG1,DC=com CN=BC-ADMIN,DC=ORG1,DC=com]'
Evaluated expression for attribute 'OU'; parms: map[CN=USER,DC=ORG1,DC=com affiliation:[]]; result: client,admin,user
但是我仍然得到相同的错误,所以我不能将ldap属性映射到证书吗

这里还有我的结节

NodeOUs:
  Enable: true
  ClientOUIdentifier:
    Certificate: cacerts/ca.org1.example.com-cert.pem
    OrganizationalUnitIdentifier: client
  PeerOUIdentifier:
    Certificate: cacerts/ca.org1.example.com-cert.pem
    OrganizationalUnitIdentifier: peer
  AdminOUIdentifier:
    Certificate: cacerts/ca.org1.example.com-cert.pem
    OrganizationalUnitIdentifier: admin
  OrdererOUIdentifier:
    Certificate: cacerts/ca.org1.example.com-cert.pem
    OrganizationalUnitIdentifier: orderer
谢谢

摘要

感谢Yacov的帮助,我发现从LDAP创建的证书总是获得客户端OU,您不能更改它,但它也有来自LDAP用户的OU,因此您可以更改节点值并将其映射到您组织的OU,对我来说,这不起作用,因为我只能更改用户的成员而不是OU


谢谢

证书需要有定义管理员的OU。查看您的MSP文件夹(在peer-MSPCONFIGPATH中)中的,并查看您对管理员的定义


您还可以尝试将您使用的证书放在对等方MSP的
admincerts
文件夹中,它还应使其成为管理员。

Hi Jacov,因此,不可能将OU映射到ldap属性吗?我是否需要在创建证书时定义admin属性?我希望能够从LDAP中删除此权限,而这将无法工作?TksI不明白你在问什么我希望能够从我的Active Directory中获取OUs值,以便我可以轻松添加和撤销用户的安装功能你可以使用任何你想要的OU名称,您只需要在我放在应答器中的MSP配置的config.yaml中相应地定义它们,但是在转换器中设置OU名称不起作用,我认为转换器只映射到证书属性,我需要在csr中设置它吗?在这样的注册请求中?ca.enroll({csr:'OU=admin',enrollmentID:adminId,enrollmentSecret:adminSecret,});或者如何从ldap设置OU?OU正在转换为admin,但不工作