У меня есть одиночная организация, работающая с одним 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.
- Я попытался использовать модуль npm для создания ключей и подписать предложение, используя его. Однако это дает ключи RSA.
- Пробовал с помощью 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. Оба они совершенно идентичны по структуре и алгоритмам подписи, используемым для открытого ключа.
Я пропускаю какие-либо критические части?