Настройка атрибутов PEM для пользовательских идентификаторов в Hyperledger Fabric - PullRequest
1 голос
/ 15 апреля 2019

У меня есть одиночная организация, работающая с одним Fabric CA. CA Server работает с MySQL. Я использую NodeSDK для подключения и выдачи транзакций в цепной код.

Я могу установить атрибуты Страна, Штат, Местность, Организация и Организационная единица для пиров и заказчиков. Однако, когда я регистрирую и регистрирую «пользователей» в Fabric, не все атрибуты устанавливаются. Только атрибуты Common Name и Organization Unit устанавливаются, как видно из файла сертификата.

Ниже приведен мой фрагмент для регистрации и регистрации пользователей:

await gateway.connect(connectionProfile, { wallet, identity: 'admin', discovery: { enabled: false } });

ca = await gateway.getClient().getCertificateAuthority();
adminIdentity = gateway.getCurrentIdentity();

const secret = await ca.register({
                affiliation: user.$affiliation,
                enrollmentID: user.$name,
                role: user.$role,
               }, adminIdentity);

const enrollment = await ca.enroll({
                    enrollmentID: user.$name,
                    enrollmentSecret: secret,
                 });
const userIdentity = await X509WalletMixin.createIdentity(process.env.ACTIVE_MSP, enrollment.certificate, enrollment.key.toBytes());

Здесь «пользователь» - это модель участника, которую я использую в своем приложении. Для общего имени (CN) задано значение «enrollmentID», для организационной единицы - «роль» + «принадлежность», а полученный сертификат для пользователя содержит следующую информацию:

Owner: CN=jondoe, OU=client + OU=admin.forwarder.com
Issuer: CN=ca.allparticipants.logistics.com, 
O=allparticipants.logistics.com, L=Bengaluru, ST=Karnataka, C=IN
Serial number: ea385863390c07c320fd6717de7878fd9f81dc3e
Valid from: Mon Apr 15 14:11:00 IST 2019 until: Tue Apr 14 14:16:00 IST 2020
Certificate fingerprints:
     MD5:  …<value>
     SHA1: …<value>
     SHA256: …<value>
Signature algorithm name: SHA256withECDSA
Subject Public Key Algorithm: 256-bit EC key
Version: 3

Extensions: 
…

Как мы видим, доступны полные атрибуты эмитента для C, ST, L, O, OU и CN. Это принадлежит MSP соответствующей организации. Однако доступны только CN и OU пользователя.

Так есть способ, с помощью которого мы можем установить другие атрибуты пользователя (C, ST, L и O) при регистрации или регистрации пользователя. Или мы должны вывести эти атрибуты из информации об эмитенте?

Обновление: 1 : Я проверил параметры клиента fabric-ca-client, которые внутренне вызывает node-sdk. Проверил регистр api. Он также не позволяет устанавливать C, ST, L и O.

Обновление : Поддерживает ли fabric-ca установку этих атрибутов для имени субъекта?

Обновление: 2 : Просматривая документацию по fabric-ca-client и, как это было предложено @nyet, я заметил, что мы можем установить эти значения в атрибуте csr.names и передать его в аргумент 'csr' команды enroll. Обновленный фрагмент кода ниже:

await gateway.connect(connectionProfile, { wallet, identity: 'admin', discovery: { enabled: false } });

ca = await gateway.getClient().getCertificateAuthority();

adminIdentity = gateway.getCurrentIdentity ();

const secret = await ca.register({
            affiliation: user.$affiliation,
            enrollmentID: user.$name,
            role: user.$role,
           }, adminIdentity);

const csrObj: any = {};
csrObj.names = 'O=Forwarder,C=IN,ST=Karnataka,L=Bengaluru';

const enrollment = await ca.enroll({
            csr: csrObj.toString(),
            enrollmentID: user.$name,
            enrollmentSecret: secret,
            });

const userIdentity = await X509WalletMixin.createIdentity(process.env.ACTIVE_MSP, enrollment.certificate, enrollment.key.toBytes());

Тем не менее, я получаю сообщение об ошибке:

Не удалось зарегистрировать smithdoe20, ошибка:% o message = Регистрация не удалась с ошибками [[{"code": 0, "message": "{\" code \ ": 9002, \" сообщение \ ": \" CSR-декодирование не удалось \ "}"}]], стек = ошибка: регистрация не выполнена с ошибками [[{"code": 0, "message": "{\" code \ ": 9002, \" сообщение \ ": \" CSR-декодирование не удалось \ "}"}]]

Аналогичная проблема JIRA: https://jira.hyperledger.org/browse/FAB-14051?jql=project%20%3D%20FAB%20AND%20statusCategory%20!%3D%20Done%20AND%20type%20%3D%20Bug%20AND%20component%20%3D%20fabric-sdk-node%20AND%20project%20%3D%20FAB%20ORDER%20BY%20createdDate%20ASC

Обновление: 3 : Документация Node-SDK гласит, что поле CSR должно быть запросом подписи сертификата PKCS # 10 в кодировке PEM.

  1. Я попытался использовать модуль npm для создания ключей и подписать предложение, используя его. Однако это дает ключи RSA.
  2. Пробовал с помощью node-pem. Не сработало.

Наконец, попытался сгенерировать ключи ECDSA и создать CSR в автономном режиме, используя следующие команды: 1. Генерация ключей: openssl ecparam -name prime256v1 -genkey -noout -out my-key.pem 2. CSR: openssl req -new -sha256 -key my-key.pem -out my.csr

Считайте этот CSR из файловой системы и передайте его в Запрос на регистрацию следующим образом:

 const csrNewVal = readFileSync('/Users/mrudavshukla/projects/pem-trials/ecdsa/my.csr', 'utf8');
 const enrollment = await ca.enroll({
                    csr: csrNewVal,
                    enrollmentID: user.$name,
                    enrollmentSecret: secret,
                });

Был в состоянии успешно зарегистрировать пользователя.

Теперь, когда мы проходим CSR, fabric-ca не возвращает нам ключ регистрации обратно. Таким образом, я получил секретный ключ из команды # 1 из файловой системы и попытался сохранить идентификационные данные этого пользователя в кошельке X509 следующим образом:

const privateNewVal = readFileSync('/Users/mrudavshukla/projects/pem-trials/ecdsa/my-key.pem', 'utf8');
const userIdentity = await X509WalletMixin.createIdentity(process.env.ACTIVE_MSP, enrollment.certificate, privateNewVal);

Однако, это выдает следующую ошибку:

ошибка: [crypto_ecdsa_aes]: importKey - {"message": "Не понимает содержимое PEM, кроме закрытых ключей и сертификатов ECDSA", "stack": "Ошибка: не понимает содержимое PEM, кроме закрытых ключей и сертификатов ECDSA ....

Затем я попытался проверить сертификат, который был сохранен для этого пользователя, с тем, который генерирует Fabric-CA, когда мы не предоставляем CSR. Оба они совершенно идентичны по структуре и алгоритмам подписи, используемым для открытого ключа.

Я пропускаю какие-либо критические части?

Ответы [ 2 ]

4 голосов
/ 18 апреля 2019

Нет смысла искать дополнительные модули для генерации ключей ECDSA и подписывать CSR этими ключами.Сама ткань предоставляет модули для этого.Ниже приведены шаги решения:

  1. Модуль «клиент-ткань» обеспечивает реализацию CryptoSuite.Используя этот криптографический пакет, мы можем генерировать ключи.Эти ключи будут 256-битными ключами ECDSA.
  2. Мы можем использовать модуль 'jsrsasign' для создания CSR.Мы можем передать ключи, сгенерированные в # 1, методу вместе с информацией о субъекте при создании CSR.Его реализация подпишет его.Fabric внутренне использует этот метод, когда мы не передаем CSR.
  3. Затем передайте этот CSR в EnrollmentRequest.
  4. При создании идентификатора для хранения в кошельке с помощью X509WalletMixin используйте сертификат из запроса на регистрацию и ключи, сгенерированные из # 1.

Код ниже:

await gateway.connect(connectionProfile, { wallet, identity: 'admin', discovery: { enabled: false } });

ca = await gateway.getClient().getCertificateAuthority();
adminIdentity = gateway.getCurrentIdentity();

const secret = await ca.register({
                affiliation: user.$virtualOrganizationBranch,
                enrollmentID: user.$name,
                role: user.$role,
            }, adminIdentity);

const privateKey = await hfc.newCryptoSuite().generateKey({ephemeral: true});

const subjectDN: string = 'CN=' + user.$name + ',C=IN,ST=Karnataka,L=Bengaluru,O=Forwarder';

const asn1 = jsrsa.asn1;
const csr = asn1.csr.CSRUtil.newCSRPEM({
                sbjprvkey: privateKey.toBytes(),
                sbjpubkey: privateKey.getPublicKey().toBytes(),
                sigalg: 'SHA256withECDSA',
                subject: {str: asn1.x509.X500Name.ldapToOneline(subjectDN)},
            });

const enrollment = await ca.enroll({
                csr,
                enrollmentID: user.$name,
                enrollmentSecret: secret,
            });

const userIdentity = await X509WalletMixin.createIdentity(process.env.ACTIVE_MSP, enrollment.certificate, privateKey.toBytes());
await wallet.import(user.$name, userIdentity);
1 голос
/ 15 апреля 2019

При использовании fabric-ca-client, fabric-ca-client enroll --csr.names "O=Org,C=US,ST=State,L=Locality" ... должно работать.Я знаю, что это не узел, но, надеюсь, он направит вас в правильном направлении.

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