千家信息网

Fabric-CA是什么工具

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下Fabric-CA是什么工具,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Fabric-CA是Hyper
千家信息网最后更新 2026年11月03日Fabric-CA是什么工具

小编给大家分享一下Fabric-CA是什么工具,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Fabric-CA是Hyperledger Fabric自带的证书管理工具,对于开发和测试非常方便。在这个教程中我们将探索Fabric-CA的使用方法并利用它完成用户的注册/Register和登记/Enrollment。

Hyperledger Fabric是一个许可制的区块链平台,在访问Fabric网络之前必须先进行身份识别并获得访问许可。Fabric网络中的身份是使用数字证书实现的,因此需要CA来处理证书的管理。

虽然Hyperledger Fabric允许使用第三方CA软件来管理用户证书,但出于方便考虑也自带了一个Fabric CA工具可以作为Fabric网络中的CA。由于Fabric自带的应用实例都是使用Fabric CA,因此我们在这个教程中将探索Fabric CA,特别是它在用户注册登记中的应用。

在这片文章中,我们使用部署在First网络上的Fabcar应用,这个实例应用包含了链码和客户端应用,其中的enrolAdmin.js和registerUser.js实现了基于Fabric CA的注册登记。

为了让整个过程展示的更清晰,我们调整了代码。同时我们也会查看Fabric CA的数据库,以便更好的理解在登记和注册时Fabric CA的运行机制。

1、安装

我们需要一个Fabric节点来运行Fabric CA的演示,它应当包含Hyperledger Fabric相关的所有软件。如果你还没有Fabric节点,可以参考这篇文章创建一个。

一旦准备好了Fabric节点,可以运行如下命令启动Fabcar演示:

cd fabric-samples/fabcar./startFabric.sh

这个脚本会启动First网络,以及每个机构的CA。让我们先重点关注Org1的Fabric-CA。

我们使用Fabcar应用中的JavaScript代码,特别是enrollAdmin.js和registerUser.js,因为这两部分代码都是用SDK来访问Fabric CA和Fabric网络。

这就是First网络以及客户端应用与Fabric网络交互的示意。让我们再次关注ca_peerOrg1以及进行登记注册的代码。

2、Fabric CA注册登记代码

访问Fabric CA涉及到两个流程。登记(enrollment)指的是用户从指定CA请求并获取数字证书,注册(registration)通常由注册员完成,他负责告诉CA签发数字证书。

给用户签发数字证书有几种不同的方式。Fabcar脚本所采用的流程类似下面这样:

  1. 在Fabric CA中登记管理员,然后管理员收到签名私钥和证书,这些资料存放在 wallet/admin目录下

  2. 管理员在Fabric CA中注册user1,CA返回一个密文

  3. CA返回的密文用于在Fabric CA中登记user1,登记后得到user1的签名私钥和证书。这些资料存放在wallet/user1目录下,将被用于后续执行链码交互(查询、交易)。

enrollAdmin.js执行步骤1,registerUser.js执行步骤2和3:

3、修改Fabric CA示例代码

我们没有修改enrollAdmin.js,它只是简单地使用默认地管理员信息(admin:adminpw),这些信息预置在fabric-samples/first-network/目录下的docker-compose-ca.yaml。结果就是admin的签名私钥和证书,保存在wallet/admin目录。

regsiterUser.js被拆分为两个文件:regUser.js和enrollUser.js,这么做的原因在于:

  • 我们可以观察到Fabric CA用户注册和登记的差异之处。

  • 我们可以看到这两个步骤实际上是由不同的角色执行的:注册步骤 是由注册员(admin)操作,而登记步骤则是用户自己使用得到的密文 来完成,这很重要,因为只有用户自己才可以知道密钥,管理员也不应当知道。

  • 我们可以把代码中的硬编码部分抽出来作为参数,这可以让代码适应Fabric CA的其他应用场景。

下面是重写代码后的示意:

4、Fabric CA用户注册:regUser.js

regUser.js需要一个参数:登记ID,返回结果是一个密文,稍后该密文将用于用户登记。注意regUser.js的执行需要Fabric CA中存在admin钱包。

node regUser.js 

代码大部分拷贝自原来的registerUser.js:

/* * SPDX-License-Identifier: Apache-2.0 */'use strict';const { FileSystemWallet, Gateway, X509WalletMixin } = require('fabric-network');const path = require('path');const ccpPath = path.resolve(__dirname, '..', '..', 'first-network', 'connection-org1.json');async function main() {    try {        // Create a new file system based wallet for managing identities.        const walletPath = path.join(process.cwd(), 'wallet');        const wallet = new FileSystemWallet(walletPath);        console.log(`Wallet path: ${walletPath}`);        const user = process.argv[2];        // Check to see if we've already enrolled the user.        const userExists = await wallet.exists(user);        if (userExists) {            console.log('An identity for the user ' + user + ' already exists in the wallet');            return;        }        // Check to see if we've already enrolled the admin user.        const adminExists = await wallet.exists('admin');        if (!adminExists) {            console.log('An identity for the admin user "admin" does not exist in the wallet');            console.log('Run the enrollAdmin.js application before retrying');            return;        }        // Create a new gateway for connecting to our peer node.        const gateway = new Gateway();        await gateway.connect(ccpPath, { wallet, identity: 'admin', discovery: { enabled: true, asLocalhost: true } });        // Get the CA client object from the gateway for interacting with the CA.        const ca = gateway.getClient().getCertificateAuthority();        const adminIdentity = gateway.getCurrentIdentity();        // Register the user, enroll the user, and import the new identity into the wallet.        const secret = await ca.register({ affiliation: 'org1.department1', enrollmentID: user, role: 'client' }, adminIdentity);        console.log('Successfully registered user ' + user + ' and the secret is ' + secret );    } catch (error) {        console.error(`Failed to register user ${user}: ${error}`);        process.exit(1);    }}main();

5、Fabric CA登记用户:enrollUser.js

enrollUser.js需要两个参数,登记ID和注册时得到的密文,返回的结果是在wallet目录中创建的钱包。注意enrollUser.js的运行不需要Fabric CA中admin钱包的存在。该文件应当由用户自己执行。

node enrollUser.js  

代码大部分来自原始的enrollAdmin.js:

/* * SPDX-License-Identifier: Apache-2.0 */'use strict';const FabricCAServices = require('fabric-ca-client');const { FileSystemWallet, X509WalletMixin } = require('fabric-network');const fs = require('fs');const path = require('path');const ccpPath = path.resolve(__dirname, '..', '..', 'first-network', 'connection-org1.json');const ccpJSON = fs.readFileSync(ccpPath, 'utf8');const ccp = JSON.parse(ccpJSON);async function main() {    try {        // Create a new CA client for interacting with the CA.        const caInfo = ccp.certificateAuthorities['ca.org1.example.com'];        const caTLSCACerts = caInfo.tlsCACerts.pem;        const ca = new FabricCAServices(caInfo.url, { trustedRoots: caTLSCACerts, verify: false }, caInfo.caName);        // Create a new file system based wallet for managing identities.        const walletPath = path.join(process.cwd(), 'wallet');        const wallet = new FileSystemWallet(walletPath);        console.log(`Wallet path: ${walletPath}`);        const user = process.argv[2];        const secret = process.argv[3];        // Check to see if we've already enrolled the admin user.        const userExists = await wallet.exists(user);        if (userExists) {            console.log('An identity for this user already exists in the wallet');            return;        }        // Enroll the admin user, and import the new identity into the wallet.        const enrollment = await ca.enroll({ enrollmentID: user, enrollmentSecret: secret });        const identity = X509WalletMixin.createIdentity('Org1MSP', enrollment.certificate, enrollment.key.toBytes());        await wallet.import(user, identity);        console.log(`Successfully enrolled user ${user} and imported it into the wallet`);    } catch (error) {        console.error(`Failed to enroll admin user "admin": ${error}`);        process.exit(1);    }}main();

6、演示

现在我们看一下如何使用这三个脚本来为Fabcar应用在Fabric CA中注册登记user1用户。

第一步,运行fabcar/startFabric.sh

在运行前确保Fabric CA的钱包目录是空的。

cd fabric-samples/fabcar./startFabric.shcd javascriptrm -rf wallet

结果如下:

第二步,安装依赖模块。

npm install

第三步,为org1的Fabric CA安装sqlite3

因为我们要查看Fabric CA的数据库,所有安装sqlite3。

打开另一个终端:

docker exec -it ca_peerOrg1 bash

为 ca_peerOrg1安装sqlite3:

apt-get updateapt-get install sqlite3

Fabric CA的数据库路径为:/etc/hyperledger/fabric-ca-server/fabric-ca-server.db,现在我们可以查看一下数据库:

cd /etc/hyperledger/fabric-ca-serversqlite3 fabric-ca-server.db

现在已经进入了sqlite3的命令行:

sqlite> .tables

结果如下:

我们的兴趣在于Fabric CA的users表和certificates表,用SQL语句查看其内容:

sqlite> select * from users;sqlite> select * from certificates;

结果如下:

我们看到用户admin已经在数据库里。这是Fabric CA启动时生成的,这个admin几乎有所有的角色,但目前还没有生成证书。

现在我们可以开始第一个登记了:登记admin。

第四步,在Fabric CA中登记admin

首先登记admin来获得其签名私钥和证书,结果存放在wallet/admin:

node enrollAdmin.js

结果:

现在再看一下users表:

可以看到admin的某个字段从0变成了1,这是其状态字段,表示已经签发了证书。

如果我们快速将其与Fabric CA钱包目录wallet/admin中的文件对比,就会看到admin的真实证书:

现在在Fabric CA中注册user1:

node regUser.js user1

结果如下:

我们现在收到密文MDfRiAUccsna,在用户登记时需要这个密文。在Fabric CA的钱包目录,我们还没有看到user1的钱包。

这时查看Fabric CA数据库就可以清晰地看到发生的事情。我们看到users1被添加到users表中,但是其证书还未签发。user1的属性与regUser.js的信息一致。另外,user1的状态是0,表示其证书还未签发。

第五步,在Fabric CA中登记user1,获取私钥和证书

运行enrollUser.js来登记user1:

node enrollUser.js user1 MDfRiAUccsna

结果如下:

我们看到user1现在出现在Fabri CA的钱包里了。我们也看到在Fabric CA数据库中user1的证书已创建:

状态从0迁移到1,表示证书已签发:

第六步,用user1运行查询脚本,检查是否有权限

node query.js

结果如下:

以上是"Fabric-CA是什么工具"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

证书 用户 代码 结果 应用 密文 目录 网络 钱包 管理 运行 数据 数据库 步骤 管理员 工具 两个 数字 数字证书 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 互联网科技有限公司经营范围 互联网下的科技发展 科技与互联网发展 互联网金融公司科技 美国互联网前沿科技 无锡溥仪互联网科技有限公司 互联网 科技馆 昭通云南众福互联网科技有限公司 互联网经济与金融科技 互联网科技与管理 智腾互联网科技有限公司 千方科技属于互联网企业吗 哈尔滨屹滨互联网科技有限公司 爱医互联网络科技 恒生互联网科技业指数调整周期 区块链结合互联网科技 神州科技互联网有限公司 九思连强互联网电子科技有限公司 上海互联网科技园景观 互联网与科技 广州大一互联网络科技有限公司 北京路客互联网科技有限公司 互联网金融科技委员会 互联网企业和科技型企业 华夏恒生互联网科技013171 半导体行业属于互联网高科技类吗 中国互联网公司的科技投入 银川新华互联网科技学校原画 美国五大互联网科技公司市值多少
0