【发布时间】:2019-04-15 10:49:54
【问题描述】:
我有一个使用一个 Fabric CA 运行的单组织设置。 CA 服务器与 MySQL 一起运行。我正在使用 NodeSDK 连接并发出交易到链码。
我可以为同行和订购者设置国家、州、地区、组织和组织单位属性。但是,当我向 Fabric 注册和注册“用户”时,并非所有属性都已设置。从证书文件中可以看出,仅设置了 Common Name 和 Organization Unit 属性。
以下是我注册和注册用户的sn-p:
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());
这里,“用户”是我在我的应用程序中使用的参与者的模型。 Common Name (CN) 设置为“enrollmentID”,Organization Unit 设置为“role”+“affiliation”,生成的用户证书包含以下信息:
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:
…
正如我们所见,Issuer 的完整 C、ST、L、O、OU 和 CN 属性是可用的。这属于各自组织的 MSP。但是,只有用户的 CN 和 OU 可用。
那么有没有一种方法可以在注册或注册用户时设置用户的其他属性(C、ST、L 和 O)。还是我们必须从发行者信息中推断出这些属性?
更新:1: 我检查了 node-sdk 内部调用的 fabric-ca-client cli 选项。检查了注册API。它也不提供设置 C、ST、L 和 O 的选项。
更新: fabric-ca 是否支持将这些属性设置为主题名称?
更新:2: 浏览fabric-ca-client 的文档并按照@nyet 的建议,我观察到我们可以在csr.names 属性中设置这些值并将其提供给enroll 命令的'csr' 参数。更新后的代码sn-p如下:
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,\" message\":\"CSR 解码失败\"}"}]],stack=Error: 注册失败,出现错误 [[{"code":0,"message":"{\"code\":9002,\" message\":\"CSR 解码失败\"}"}]]
更新:3: Node-SDK 文档指出 CSR 字段应该是 PEM 编码的 PKCS#10 证书签名请求。
- 我尝试利用 node-forge npm 模块生成密钥并使用它签署提案。但是,这会提供 RSA 密钥。
- 尝试使用 node-pem。也没有成功。
最后,尝试生成 ECDSA 密钥并使用以下命令离线创建 CSR: 1.密钥生成:openssl ecparam -name prime256v1 -genkey -noout -out my-key.pem 2、企业社会责任:openssl req -new -sha256 -key my-key.pem -out my.csr
从文件系统中读取此 CSR 并将其传递给 Enrollment Request,如下所示:
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);
但是,这会引发以下错误:
error: [crypto_ecdsa_aes]: importKey - {"message":"不理解除 ECDSA 私钥和证书之外的 PEM 内容","stack":"错误:不理解除 ECDSA 私钥和证书之外的 PEM 内容....
接下来,我尝试使用 fabric-ca 在我们不提供 CSR 时生成的证书检查为该用户保存的证书。两者在结构和用于公钥的签名算法上完全相同。
我错过了任何关键部分吗?
【问题讨论】:
-
这不起作用....正如 API 文档指定的那样,
EnrollmentRequest的可选csr字段实际上需要是 PEM 编码的 PKCS10 证书请求。 -
@GariSingh 试过了。是否应该使用 ECDSA 而不是 RSA 生成密钥?我尝试了一个提供 RSA 密钥的 npm 模块,并用它创建了一个 csr,并且能够提交 EnrolmentRequest。但是,在使用 X509WalletMixin.createIdentity(...) 为钱包创建身份时,它会抛出一个异常,上面写着:“消息”:“除了 ECDSA 私钥和证书之外,不理解 PEM 内容”。
-
你肯定需要使用 ECDSA
-
@GariSingh:尝试对 ECDSA 密钥执行相同操作并使用该证书签署 CSR。尽管如此,它还是抛出了同样的异常。复制步骤:更新问题中的#3。
标签: hyperledger-fabric hyperledger-fabric-ca hyperledger-fabric-sdk-js