溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Fabric-CA是什么工具

發(fā)布時間:2021-12-28 17:22:38 來源:億速云 閱讀:170 作者:小新 欄目:互聯(lián)網(wǎng)科技

小編給大家分享一下Fabric-CA是什么工具,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Fabric-CA是Hyperledger Fabric自帶的證書管理工具,對于開發(fā)和測試非常方便。在這個教程中我們將探索Fabric-CA的使用方法并利用它完成用戶的注冊/Register和登記/Enrollment。

Hyperledger Fabric是一個許可制的區(qū)塊鏈平臺,在訪問Fabric網(wǎng)絡之前必須先進行身份識別并獲得訪問許可。Fabric網(wǎng)絡中的身份是使用數(shù)字證書實現(xiàn)的,因此需要CA來處理證書的管理。

雖然Hyperledger Fabric允許使用第三方CA軟件來管理用戶證書,但出于方便考慮也自帶了一個Fabric CA工具可以作為Fabric網(wǎng)絡中的CA。由于Fabric自帶的應用實例都是使用Fabric CA,因此我們在這個教程中將探索Fabric CA,特別是它在用戶注冊登記中的應用。

在這片文章中,我們使用部署在First網(wǎng)絡上的Fabcar應用,這個實例應用包含了鏈碼和客戶端應用,其中的enrolAdmin.js和registerUser.js實現(xiàn)了基于Fabric CA的注冊登記。

為了讓整個過程展示的更清晰,我們調整了代碼。同時我們也會查看Fabric CA的數(shù)據(jù)庫,以便更好的理解在登記和注冊時Fabric CA的運行機制。

1、安裝

我們需要一個Fabric節(jié)點來運行Fabric CA的演示,它應當包含Hyperledger Fabric相關的所有軟件。如果你還沒有Fabric節(jié)點,可以參考這篇文章創(chuàng)建一個。

一旦準備好了Fabric節(jié)點,可以運行如下命令啟動Fabcar演示:

cd fabric-samples/fabcar
./startFabric.sh

這個腳本會啟動First網(wǎng)絡,以及每個機構的CA。讓我們先重點關注Org1的Fabric-CA。

我們使用Fabcar應用中的JavaScript代碼,特別是enrollAdmin.js和registerUser.js,因為這兩部分代碼都是用SDK來訪問Fabric CA和Fabric網(wǎng)絡。

這就是First網(wǎng)絡以及客戶端應用與Fabric網(wǎng)絡交互的示意。讓我們再次關注ca_peerOrg1以及進行登記注冊的代碼。

Fabric-CA是什么工具

2、Fabric CA注冊登記代碼

訪問Fabric CA涉及到兩個流程。登記(enrollment)指的是用戶從指定CA請求并獲取數(shù)字證書,注冊(registration)通常由注冊員完成,他負責告訴CA簽發(fā)數(shù)字證書。

給用戶簽發(fā)數(shù)字證書有幾種不同的方式。Fabcar腳本所采用的流程類似下面這樣:

  1. 在Fabric CA中登記管理員,然后管理員收到簽名私鑰和證書,這些資料存放在 wallet/admin目錄下

  2. 管理員在Fabric CA中注冊user1,CA返回一個密文

  3. CA返回的密文用于在Fabric CA中登記user1,登記后得到user1的簽名私鑰和證書。這些資料存放在wallet/user1目錄下,將被用于后續(xù)執(zhí)行鏈碼交互(查詢、交易)。

enrollAdmin.js執(zhí)行步驟1,registerUser.js執(zhí)行步驟2和3:

Fabric-CA是什么工具

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用戶注冊和登記的差異之處。

  • 我們可以看到這兩個步驟實際上是由不同的角色執(zhí)行的:注冊步驟 是由注冊員(admin)操作,而登記步驟則是用戶自己使用得到的密文 來完成,這很重要,因為只有用戶自己才可以知道密鑰,管理員也不應當知道。

  • 我們可以把代碼中的硬編碼部分抽出來作為參數(shù),這可以讓代碼適應Fabric CA的其他應用場景。

下面是重寫代碼后的示意:

Fabric-CA是什么工具

4、Fabric CA用戶注冊:regUser.js

regUser.js需要一個參數(shù):登記ID,返回結果是一個密文,稍后該密文將用于用戶登記。注意regUser.js的執(zhí)行需要Fabric CA中存在admin錢包。

node regUser.js <enrollmentID>

代碼大部分拷貝自原來的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需要兩個參數(shù),登記ID和注冊時得到的密文,返回的結果是在wallet目錄中創(chuàng)建的錢包。注意enrollUser.js的運行不需要Fabric CA中admin錢包的存在。該文件應當由用戶自己執(zhí)行。

node enrollUser.js <enrollmentID> <secret>

代碼大部分來自原始的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、演示

現(xiàn)在我們看一下如何使用這三個腳本來為Fabcar應用在Fabric CA中注冊登記user1用戶。

第一步,運行fabcar/startFabric.sh

在運行前確保Fabric CA的錢包目錄是空的。

cd fabric-samples/fabcar
./startFabric.shcd javascript
rm -rf wallet

結果如下:

Fabric-CA是什么工具

第二步,安裝依賴模塊。

npm install

第三步,為org1的Fabric CA安裝sqlite3

因為我們要查看Fabric CA的數(shù)據(jù)庫,所有安裝sqlite3。

打開另一個終端:

docker exec -it ca_peerOrg1 bash

為 ca_peerOrg1安裝sqlite3:

apt-get update
apt-get install sqlite3

Fabric CA的數(shù)據(jù)庫路徑為:/etc/hyperledger/fabric-ca-server/fabric-ca-server.db,現(xiàn)在我們可以查看一下數(shù)據(jù)庫:

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

現(xiàn)在已經(jīng)進入了sqlite3的命令行:

sqlite> .tables

結果如下:

Fabric-CA是什么工具

我們的興趣在于Fabric CA的users表和certificates表,用SQL語句查看其內容:

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

結果如下:

Fabric-CA是什么工具

我們看到用戶admin已經(jīng)在數(shù)據(jù)庫里。這是Fabric CA啟動時生成的,這個admin幾乎有所有的角色,但目前還沒有生成證書。

現(xiàn)在我們可以開始第一個登記了:登記admin。

第四步,在Fabric CA中登記admin

首先登記admin來獲得其簽名私鑰和證書,結果存放在wallet/admin:

node enrollAdmin.js

結果:

Fabric-CA是什么工具

現(xiàn)在再看一下users表:

Fabric-CA是什么工具

可以看到admin的某個字段從0變成了1,這是其狀態(tài)字段,表示已經(jīng)簽發(fā)了證書。

Fabric-CA是什么工具

如果我們快速將其與Fabric CA錢包目錄wallet/admin中的文件對比,就會看到admin的真實證書:

Fabric-CA是什么工具

現(xiàn)在在Fabric CA中注冊user1:

node regUser.js user1

結果如下:

Fabric-CA是什么工具

我們現(xiàn)在收到密文MDfRiAUccsna,在用戶登記時需要這個密文。在Fabric CA的錢包目錄,我們還沒有看到user1的錢包。

這時查看Fabric CA數(shù)據(jù)庫就可以清晰地看到發(fā)生的事情。我們看到users1被添加到users表中,但是其證書還未簽發(fā)。user1的屬性與regUser.js的信息一致。另外,user1的狀態(tài)是0,表示其證書還未簽發(fā)。

Fabric-CA是什么工具

第五步,在Fabric CA中登記user1,獲取私鑰和證書

運行enrollUser.js來登記user1:

node enrollUser.js user1 MDfRiAUccsna

結果如下:

Fabric-CA是什么工具

我們看到user1現(xiàn)在出現(xiàn)在Fabri CA的錢包里了。我們也看到在Fabric CA數(shù)據(jù)庫中user1的證書已創(chuàng)建:

Fabric-CA是什么工具

狀態(tài)從0遷移到1,表示證書已簽發(fā):

Fabric-CA是什么工具

第六步,用user1運行查詢腳本,檢查是否有權限

node query.js

結果如下:

Fabric-CA是什么工具

以上是“Fabric-CA是什么工具”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI