Управление идентификацией в Hyperledger Fabric - PullRequest
1 голос
/ 12 июня 2019

Я использую Hyperledger Fabric 1.4.1 и последние версии fabric-contract-api для интеллектуальных контрактов, fabric-client для низкоуровневых API-интерфейсов для управления созданием каналов и цепных кодов и fabric-network для взаимодействия с коллегами.,Я сослался на этот пример для настройки моей сети.

Я написал базовый пакет с цепочечным кодом в nodejs и настроил простую сеть 1 org, 1 peer, 1 orderer.Первым шагом является подключение к равноправному узлу и использование fabric-ca-client для создания удостоверения администратора.В соответствии с примерами использовались идентификатор регистрации и секрет admin, adminpw.Это зависит от конфигурации , используемой здесь .

Код, который я использую для создания и присоединения к каналу с последующей установкой и созданием цепного кода:

const CAClient = require('fabric-ca-client');
const client = require('fabric-client');
const User = client.User;
const fs = require('fs');
const path = require('path');
const basePath = path.resolve(__dirname, '../certs');
const readCryptoFile = filename => fs.readFileSync(path.resolve(basePath, filename)).toString();
const ccPath = path.resolve(__dirname, '../chaincode/src/ax-chaincode');
const url = require('url');
const http = require('http');

  let myClient = new client();
  const ordererConfig = {
    hostname: 'orderer0',
    url: 'grpc://localhost:7050',
    pem: readCryptoFile('ordererOrg.pem')
  };
  const orderer = myClient.newOrderer(ordererConfig.url, {
    pem: ordererConfig.pem,
    'ssl-target-name-override': ordererConfig.hostname
  });

  let peerConfig = {
    hostname: 'ax-peer',
    url: 'grpc://localhost:7051', // change to grpcs://ax-peer:7051 in some condition (no idea?)
    eventHubUrl: 'grpc://localhost:7053',
    pem: readCryptoFile('axOrg.pem')
  };
  const defaultPeer = myClient.newPeer(peerConfig.url, {
    pem: peerConfig.pem,
    'ssl-target-name-override': peerConfig.hostname
  });
  // console.log(defaultPeer);
  myClient.setStateStore(await client.newDefaultKeyValueStore({
    path: './ax-peer'
  }))

let url = 'http://localhost:7054'
    const ca = new CAClient(url, {
      verify: false
    });
    let enrollmentID = 'admin';
    let enrollmentSecret = 'adminpw';
    const enrollment = await ca.enroll({
      enrollmentID: 'admin',
      enrollmentSecret: 'adminpw'
    });
    user = new User(enrollmentID, myClient);
    // console.log(enrollment);
    await user.setEnrollment(enrollment.key, enrollment.certificate, 'AxOrgMSP');

Выше будет проверено, доступен ли пользователь admin в хранилище состояний.Некоторые запросы, относящиеся к описанному выше процессу

  1. Сгенерированный здесь пользователь-администратор может использоваться для взаимодействия с любыми и всеми одноранговыми узлами одной и той же организации при условии, что используется только один ЦС?
  2. практическое использование этого идентификатора, поскольку для остальных функций используется идентификатор администратора, сгенерированный cryptogen для каждого узла (код ниже)
  3. При регистрации администратора никакие attrs не передаютсяв ca.enroll(), поэтому, естественно, при запросе тождества поле roles возвращает ноль.Общая ссылка ca-server четко назначает ей роли client, user, peer, validator, auditor.Разве это не должно отражаться здесь, поскольку он использует admin и adminpw для регистрации идентификатора и секрета?

Продолжение кода

  // crypto material got from cryptogen and shifted to new folder
  let adminUser = await myClient.createUser({
    username: `Admin@ax-peer`,
    mspid: 'AxOrgMSP',
    cryptoContent: {
      privateKeyPEM: readCryptoFile('Admin@ax-org-key.pem'),
      signedCertPEM: readCryptoFile('Admin@ax-org-cert.pem')
    }
  });
  let txId = myClient.newTransactionID();
  let envelope_bytes = fs.readFileSync('./channel.tx');
  let channelConfig = myClient.extractChannelConfig(envelope_bytes);
  let signature = myClient.signChannelConfig(channelConfig);
  const request = {
      name: 'default',
      orderer: orderer,
      config: channelConfig,
      signatures: [signature],
      txId: txId
    };
   const response = await myClient.createChannel(request); // should be 200
   // rest of code joins channel, installs and instantiates chaincode
   // docker logs show init function being called in new cc container

У stateStore есть два файлав нем (как и ожидалось), вызывается admin и Admin@ax-peer.Они выглядят как

"name": "Admin@ax-peer",
  "mspid": "AxOrgMSP",
  "roles": null,
  "affiliation": "",
  "enrollmentSecret": "",
  enrollment: {
    "signingIdentity": "554a5f5cfc5a59231a04b7b051bcbcb4f79c4226ff336a4aa48b551de4a8428f",
    "certificate": "-----BEGIN CERTIFICATE----- xyz -----END CERTIFICATE-----"
  }

Когда этот пользователь используется из хранилища состояний await myClient.getUserContext('admin', true);, как клиент подписывает транзакции?Я не могу найти закрытый ключ / сертификат для любого пользователя, созданного с помощью fabric-client SDK.

Теперь Если я использую fabric-network API, реализуется функция FileSystemWallet(), которая хранит закрытый и открытый сертификатдля каждого созданного им пользователя.

const enrollment = await ca.enroll({ enrollmentID: `admin`, enrollmentSecret: `adminpw` });
const identity = X509WalletMixin.createIdentity('AxOrgMSP', enrollment.certificate, enrollment.key.toBytes());
wallet.import('admin', identity);

Эта функция служит той же цели, что и ca.enroll(), но хранит частный сертификат видимым образом.Если я хочу использовать пользователей, созданных с помощью fabric-client в fabric-network SDK, мне нужно будет сдвинуть сертификаты, как мне этого добиться?

TLDR - Зарегистрируйте пользователя с помощью fabric-client и затем используйтеGateway() класс из fabric-network для отправки транзакций с одним и тем же пользователем.

Любые советы, рекомендации приветствуются.Спасибо!

1 Ответ

2 голосов
/ 14 июня 2019

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

  1. Идентификатор администратора, который вы регистрируете с сервера ca, называется admin, поскольку он является регистратором фабричного сервера ca и, таким образом, может регистрировать больше идентификаторов на сервере ca. Это не идентификация администратора для чего-либо еще, такого как сеть фабрики.
  2. Вы использовали как API нижнего уровня, так и механизм Fabric-Network для управления идентификацией. В API нижнего уровня все, что сохранялось в файловой системе, было хранилищем состояний, открытый сертификат и закрытый ключ хранятся в памяти исключительно из-за того, как вы называете все, что происходит с настройками по умолчанию таким образом, к сожалению, другие подходы использование API низкого уровня может потребовать от вас явной установки криптографии с помощью cryptoKeyStore. В реализации кошелька вы, вероятно, использовали кошелек файловой системы, поэтому все сохранялось в файловой системе.

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

gateway.getClient()

or

network.getChannel()

для получения клиента / канала, который был предварительно настроен с конфигурацией шлюза и идентификатором. Чтобы получить доступ к центру сертификации, вы можете использовать gateway.getClient().getCertificateAuthority() Все это позволяет вам использовать реализацию кошелька для управления идентификацией (а реализация кошелька предоставляет различные механизмы сохранения, такие как память, файловая система, couchdb или вы можете написать свой собственный)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...