你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 Azure SDK for JavaScript and TypeScript 创建 Azure 托管 CCF 资源

Microsoft Azure 托管 CCF(托管 CCF)是一项用于部署机密应用程序的全新且高度安全的服务。 有关 Azure 托管 CCF 的详细信息,请参阅关于 Azure 托管机密联盟框架

如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户

API 参考文档 | 库源代码 | 包 (npm)

先决条件

安装

本快速入门结合使用 Azure 标识库和 Azure CLI 或 Azure PowerShell,向 Azure 服务验证用户身份。 开发人员还可以使用 Visual Studio 或 Visual Studio Code 来验证其调用。 有关详细信息,请参阅使用 Azure 标识客户端库对客户端进行身份验证

登录到 Azure

使用 Azure CLI az login 命令或 Azure PowerShell Connect-AzAccount cmdlet 登录到 Azure。

az login

如果 CLI 或 PowerShell 可以打开默认浏览器,它将这样做并加载 Azure 登录页。 否则,请访问 https://aka.ms/devicelogin,然后输入终端中显示的授权代码。

如果出现提示,则在浏览器中使用帐户凭据登录。

初始化新的 npm 项目

在终端或命令提示符中,创建合适的项目文件夹并初始化 npm 项目。 如果已有节点项目,则可以跳过此步骤。

cd <work folder>
npm init -y

安装包

安装 Azure Active Directory 标识客户端库。

npm install --save @azure/identity

安装 Azure 机密账本管理平面客户端库。

npm install -save @azure/arm-confidentialledger@1.3.0-beta.1

全局安装 TypeScript 编译器和工具

npm install -g typescript

创建资源组

资源组是在其中部署和管理 Azure 资源的逻辑容器。 使用 Azure PowerShell New-AzResourceGroup cmdlet 在 southcentralus 位置创建一个名为 myResourceGroup 的资源组。

New-AzResourceGroup -Name "myResourceGroup" -Location "SouthCentralUS"

注册资源提供程序

创建资源之前,必须在订阅中注册 Azure 托管 CCF 资源类型。

az feature registration create --namespace Microsoft.ConfidentialLedger --name ManagedCCF

az provider register --namespace Microsoft.ConfidentialLedger

创建成员

为成员生成密钥对。 以下命令完成后,成员的公钥保存在 member0_cert.pem 中,私钥保存在 member0_privk.pem 中。

openssl ecparam -out "member0_privk.pem" -name "secp384r1" -genkey
openssl req -new -key "member0_privk.pem" -x509 -nodes -days 365 -out "member0_cert.pem" -"sha384" -subj=/CN="member0"

创建 JavaScript 应用程序

使用管理平面客户端库

Azure SDK for JavaScript 和 TypeScript 库 azure/arm-confidentialledger 允许对托管 CCF 资源执行操作,例如创建和删除、列出与订阅关联的资源,以及查看特定资源的详细信息。

若要运行以下示例,请将代码片段保存到扩展名 .ts 为项目文件夹中的文件,并将其编译为 TypeScript 项目的一部分,或者通过运行将脚本单独编译为 JavaScript:

tsc <filename.ts>

编译的 JavaScript 文件的名称相同,但扩展名相同 *.js 。 然后在 nodeJS 中运行脚本:

node <filename.js>

以下示例 TypeScript 代码创建并查看托管 CCF 资源的属性。

import  { ConfidentialLedgerClient, ManagedCCFProperties, ManagedCCF, KnownLanguageRuntime, DeploymentType, MemberIdentityCertificate } from "@azure/arm-confidentialledger";
import { DefaultAzureCredential } from "@azure/identity";

// Please replace these variables with appropriate values for your project
const subscriptionId = "0000000-0000-0000-0000-000000000001";
const rgName = "myResourceGroup";
const ledgerId = "testApp";
const memberCert0 = "-----BEGIN CERTIFICATE-----\nMIIBvjCCAUSgAwIBAg...0d71ZtULNWo\n-----END CERTIFICATE-----";
const memberCert1 = "-----BEGIN CERTIFICATE-----\nMIIBwDCCAUagAwIBAgI...2FSyKIC+vY=\n-----END CERTIFICATE-----";

async function main() {
    console.log("Creating a new instance.")
    const client = new ConfidentialLedgerClient(new DefaultAzureCredential(), subscriptionId);

    const properties = <ManagedCCFProperties> {
        deploymentType: <DeploymentType> {
            appSourceUri: "",
            languageRuntime: KnownLanguageRuntime.JS
        },
        memberIdentityCertificates: [
            <MemberIdentityCertificate>{
                certificate: memberCert0,
                encryptionkey: "",
                tags: { 
                    "owner":"member0"
                }
            },
            <MemberIdentityCertificate>{
                certificate: memberCert1,
                encryptionkey: "",
                tags: { 
                    "owner":"member1"
                }
            },
        ],
        nodeCount: 3,
    };

    const mccf = <ManagedCCF> {
        location: "SouthCentralUS",
        properties: properties,
    }

    const createResponse = await client.managedCCFOperations.beginCreateAndWait(rgName, ledgerId, mccf);
    console.log("Created. Instance id: " +  createResponse.id);

    // Get details of the instance
    console.log("Getting instance details.");
    const getResponse = await client.managedCCFOperations.get(rgName, ledgerId);
    console.log(getResponse.properties?.identityServiceUri);
    console.log(getResponse.properties?.nodeCount);

    // List mccf instances in the RG
    console.log("Listing the instances in the resource group.");
    const instancePages = await client.managedCCFOperations.listByResourceGroup(rgName).byPage();
    for await(const page of instancePages){
        for(const instance of page)
        {
            console.log(instance.name + "\t" + instance.location + "\t" + instance.properties?.nodeCount);
        }
    }

    console.log("Delete the instance.");
    await client.managedCCFOperations.beginDeleteAndWait(rgName, ledgerId);
    console.log("Deleted.");
}

(async () => {
    try {
        await main();
    } catch(err) {
        console.error(err);
    }
})();

删除托管 CCF 资源

以下代码片段删除托管 CCF 资源。 其他托管 CCF 文章可以根据本快速入门编写。 如果打算继续使用后续的快速入门和教程,则可能需要保留这些资源。

import  { ConfidentialLedgerClient, ManagedCCFProperties, ManagedCCF, KnownLanguageRuntime, DeploymentType, MemberIdentityCertificate } from "@azure/arm-confidentialledger";
import { DefaultAzureCredential } from "@azure/identity";

const subscriptionId = "0000000-0000-0000-0000-000000000001"; // replace
const rgName = "myResourceGroup";
const ledgerId = "confidentialbillingapp";

async function deleteManagedCcfResource() {
    const client = new ConfidentialLedgerClient(new DefaultAzureCredential(), subscriptionId);

    console.log("Delete the instance.");
    await client.managedCCFOperations.beginDeleteAndWait(rgName, ledgerId);
    console.log("Deleted.");
}

(async () => {
    try {
        await deleteManagedCcfResource();
    } catch(err) {
        console.error(err);
    }
})();

清理资源

其他托管 CCF 文章可以根据本快速入门编写。 如果打算继续使用后续的快速入门和教程,则可能需要保留这些资源。

否则,当完成本文中创建的资源后,请使用 Azure CLI az group delete 命令删除资源组及其包含的所有资源。

az group delete --resource-group myResourceGroup

后续步骤

在本快速入门中,你使用 Azure Python SDK for Confidential Ledger 创建了托管 CCF 资源。 要详细了解 Azure 托管 CCF 以及如何将其与应用程序集成,请继续阅读以下文章: