Python용 Azure Confidential Ledger 클라이언트 라이브러리 - 버전 1.1.1

Azure Confidential Ledger는 변경할 수 없는 변조 방지 원장에 로깅하기 위한 서비스를 제공합니다. Azure Confidential Computing 포트폴리오의 일부로 Azure Confidential Ledger는 Enclave라고도 하는 안전한 하드웨어 기반 신뢰할 수 있는 실행 환경에서 실행됩니다. Microsoft Research의 기밀 컨소시엄 프레임워크를 기반으로 합니다.

소스 코드 | 패키지(PyPI) | 패키지(Conda) | API 참조 설명서 | 제품 설명서

시작

패키지 설치

pip를 사용하여 azure-confidentialledgerazure-identity를 설치합니다.

pip install azure-identity azure-confidentialledger

azure-identity 는 아래와 같이 Azure Active Directory 인증에 사용됩니다.

필수 구성 요소

  • Azure 구독
  • Python 3.6 이상
  • Azure Confidential Ledger의 실행 중인 인스턴스.
  • 일반적으로 ARM 리소스를 만드는 동안 권한으로 Administrator 할당되는 Confidential Ledger에 등록된 사용자입니다.

클라이언트 인증

Azure Active Directory 사용

이 문서에서는 DefaultAzureCredential을 사용하여 Azure Active Directory를 통해 Confidential Ledger에 인증하는 방법을 보여 줍니다. 그러나 는 ConfidentialLedgerClient모든 azure-identity 자격 증명을 허용합니다. 다른 자격 증명에 대한 자세한 내용은 azure-identity 설명서를 참조하세요.

클라이언트 인증서 사용

Azure Active Directory 대신 클라이언트는 클라이언트 인증서를 사용하여 상호 TLS를 통해 인증하도록 선택할 수 있습니다. azure.confidentialledger.ConfidentialLedgerCertificateCredential 이 용도로 사용될 수 있습니다.

클라이언트 만들기

DefaultAzureCredential 는 대부분의 Azure SDK 클라이언트 시나리오를 자동으로 처리합니다. 시작하려면 Confidential Ledger에 등록된 AAD ID에 대한 환경 변수를 설정합니다.

export AZURE_CLIENT_ID="generated app id"
export AZURE_CLIENT_SECRET="random password"
export AZURE_TENANT_ID="tenant id"

그런 다음 를 DefaultAzureCredential 인증할 수 있습니다 ConfidentialLedgerClient.

클라이언트를 생성하려면 Azure CLI 또는 Azure Portal에서 가져올 수 있는 Confidential Ledger의 URL 및 ID도 필요합니다. 이러한 값을 검색한 경우 아래 예제에서 및 "https://my-ledger-id.confidential-ledger.azure.com""my-ledger-id" 인스턴스를 바꿉니다. 원장의 ARM 설명에서 identityServiceUri 를 의 호스트 이름으로 바꿔 "https://identity.confidential-ledger.core.azure.com" 야 할 수도 있습니다.

Confidential Ledgers는 Enclave에 안전하게 생성되고 저장된 자체 서명된 인증서를 사용하므로 먼저 각 Confidential Ledger에 대한 서명 인증서를 기밀 원장 ID 서비스에서 검색해야 합니다.

from azure.confidentialledger import ConfidentialLedgerClient
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient
from azure.identity import DefaultAzureCredential

identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id="my-ledger-id"
)

ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

credential = DefaultAzureCredential()
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name
)

ConfidentialLedgerClient 생성자는 존재하지 않는 파일과 함께 제공된 경우 원장 TLS 인증서를 가져오고 지정된 파일에 씁니다. 사용자는 필요에 따라 만든 파일을 제거할 책임이 있습니다.

from azure.confidentialledger import ConfidentialLedgerClient
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path="ledger_certificate.pem"
)

# The ledger TLS certificate is written to `ledger_certificate.pem`.

파일이 원장 TLS 인증서에 사용되고 있음을 분명히 하기 위해 후속 예제에서는 원장 TLS 인증서를 파일에 명시적으로 씁니다.

주요 개념

원장 항목 및 트랜잭션

Azure Confidential Ledger에 쓸 때마다 서비스에서 변경할 수 없는 원장 항목이 생성됩니다. 트랜잭션이라고도 하는 쓰기는 각 쓰기에 따라 증가되는 트랜잭션 ID로 고유하게 식별됩니다. 작성되면 언제든지 원장 항목을 검색할 수 있습니다.

컬렉션

대부분의 사용 사례에는 Confidential Ledger당 하나의 컬렉션만 포함되지만 의미 체계 또는 논리적으로 다른 데이터 그룹을 동일한 Confidential Ledger에 저장해야 하는 경우 컬렉션 ID 기능을 제공합니다.

원장 항목은 에서 검색됩니다 collectionId. Confidential Ledger는 항상 지정된 없이 collectionId 작성된 항목에 대해 서비스가 결정 collectionId 되는 상수를 가정합니다.

사용자

사용자는 Azure를 통해서가 아니라 Confidential Ledger로 직접 관리됩니다. 사용자는 AAD 기반일 수 있으며, AAD 개체 ID로 식별되거나 PEM 인증서 지문으로 식별되는 인증서 기반일 수 있습니다.

Receipts

트랜잭션 무결성 보장을 적용하기 위해 Azure Confidential Ledger는 [Merkle 트리][merkle_tree_wiki] 데이터 구조를 사용하여 변경할 수 없는 원장에 추가된 모든 트랜잭션 블록의 해시를 기록합니다. 쓰기 트랜잭션이 커밋된 후 Azure Confidential Ledger 사용자는 Confidential Ledger에서 생성된 항목에 대한 암호화 Merkle 증명 또는 영수증을 가져와 쓰기 작업이 올바르게 저장되었는지 확인할 수 있습니다. 쓰기 트랜잭션 영수증은 시스템이 해당 트랜잭션을 커밋했다는 증거이며 항목이 원장에 효과적으로 추가되었는지 확인하는 데 사용할 수 있습니다.

Azure Confidential Ledger 쓰기 트랜잭션 영수증에 대한 자세한 내용은 다음 문서를 참조하세요.

영수증 확인

쓰기 트랜잭션에 대한 영수증을 받은 후 Azure Confidential Ledger 사용자는 확인 알고리즘에 따라 페치된 영수증의 내용을 확인할 수 있습니다. 확인의 성공은 영수증과 연결된 쓰기 작업이 변경할 수 없는 원장에 올바르게 추가되었다는 증거입니다.

Azure Confidential Ledger 쓰기 트랜잭션 영수증에 대한 확인 프로세스에 대한 자세한 내용은 다음 문서를 참조하세요.

애플리케이션 클레임

Azure Confidential Ledger 애플리케이션은 애플리케이션 클레임이라는 임의의 데이터를 연결하여 트랜잭션을 작성할 수 있습니다. 이러한 클레임은 쓰기 작업 중에 실행된 작업을 나타냅니다. 트랜잭션에 연결되면 클레임 개체의 SHA-256 다이제스트가 원장에 포함되고 쓰기 트랜잭션의 일부로 커밋됩니다. 이렇게 하면 다이제스트가 제자리에서 서명되고 변조될 수 없습니다.

나중에 애플리케이션 클레임은 추가된 동일한 트랜잭션에 해당하는 영수증 페이로드에서 소화되지 않은 형태로 표시될 수 있습니다. 이를 통해 사용자는 영수증의 정보를 활용하여 트랜잭션 중에 Azure Confidential Ledger instance 연결 및 로그인한 것과 동일한 클레임 다이제스트를 다시 계산할 수 있습니다. 클레임 다이제스트는 쓰기 트랜잭션 확인 확인 프로세스의 일부로 사용할 수 있으므로 사용자가 기록된 클레임의 신뢰성을 완전히 확인할 수 있는 오프라인 방법을 제공합니다.

애플리케이션 클레임 형식 및 다이제스트 계산 알고리즘에 대한 자세한 내용은 다음 링크에서 확인할 수 있습니다.

CCF 애플리케이션 클레임에 대한 자세한 내용은 다음 CCF 설명서 페이지를 참조하세요.

기밀 컴퓨팅

Azure 기밀 컴퓨팅 을 사용하면 클라우드에서 처리되는 동안 데이터를 격리하고 보호할 수 있습니다. Azure Confidential Ledger는 Azure Confidential Computing 가상 머신에서 실행되므로 사용 중인 데이터의 암호화를 통해 더 강력한 데이터 보호를 제공합니다.

기밀 컨소시엄 프레임워크

Azure Confidential Ledger는 Microsoft Research의 CCF(오픈 소스 기밀 컨소시엄 프레임워크)를 기반으로 합니다. CCF에서 애플리케이션은 애플리케이션 작업을 수정하고 관리하는 제안을 제출할 수 있는 멤버 컨소시엄에 의해 관리됩니다. Azure Confidential Ledger에서 Microsoft Azure는 Confidential Ledger에서 비정상 노드를 교체하고 Enclave 코드를 업그레이드하는 등의 거버넌스 및 유지 관리 작업을 수행할 수 있는 운영자 멤버 ID를 소유합니다.

예제

이 섹션에는 다음을 비롯한 일반적인 작업을 다루는 코드 조각이 포함되어 있습니다.

항목 추가

변조 방지 방식으로 변경 없이 저장해야 하는 데이터는 원장에 항목을 추가하여 Azure Confidential Ledger에 저장할 수 있습니다.

Confidential Ledger는 분산 시스템이므로 드문 일시적인 오류로 인해 쓰기가 손실될 수 있습니다. 보존해야 하는 항목의 경우 쓰기가 지속성이 있는지 확인하는 것이 좋습니다. 클라이언트 처리량이 더 높은 것이 선호되는 덜 중요한 쓰기의 경우 대기 단계를 건너뛸 수 있습니다.

from azure.confidentialledger import ConfidentialLedgerClient
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient
from azure.identity import DefaultAzureCredential

identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id="my-ledger-id"
)

ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

credential = DefaultAzureCredential()
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name
)

post_entry_result = ledger_client.create_ledger_entry(
        {"contents": "Hello world!"}
    )
transaction_id = post_entry_result["transactionId"]

wait_poller = ledger_client.begin_wait_for_commit(transaction_id)
wait_poller.wait()
print(f'Ledger entry at transaction id {transaction_id} has been committed successfully')

또는 클라이언트가 원장 항목을 작성할 때 커밋을 기다릴 수 있습니다.

from azure.confidentialledger import ConfidentialLedgerClient
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient
from azure.identity import DefaultAzureCredential

identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id="my-ledger-id"
)

ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

credential = DefaultAzureCredential()
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name
)

post_poller = ledger_client.begin_create_ledger_entry(
    {"contents": "Hello world again!"}
)
new_post_result = post_poller.result()
print(
    'The new ledger entry has been committed successfully at transaction id '
    f'{new_post_result["transactionId"]}'
)

원장 항목 검색

서비스가 기록 항목을 로드할 때 최신보다 오래된 원장 항목을 가져오는 데 다소 시간이 걸릴 수 있으므로 폴러가 제공됩니다.

원장 항목은 컬렉션에 의해 검색됩니다. 반환된 값은 트랜잭션 ID로 식별되는 시점에 지정된 컬렉션에 포함된 값입니다.

from azure.confidentialledger import ConfidentialLedgerClient
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient
from azure.identity import DefaultAzureCredential

identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id="my-ledger-id"
)

ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

credential = DefaultAzureCredential()
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name
)

post_poller = ledger_client.begin_create_ledger_entry(
    {"contents": "Original hello"}
)
post_result = post_poller.result()

post_transaction_id = post_result["transactionId"]

latest_entry = ledger_client.get_current_ledger_entry()
print(
    f'Current entry (transaction id = {latest_entry["transactionId"]}) '
    f'in collection {latest_entry["collectionId"]}: {latest_entry["contents"]}'
)

post_poller = ledger_client.begin_create_ledger_entry(
    {"contents": "Hello!"}
)
post_result = post_poller.result()

get_entry_poller = ledger_client.begin_get_ledger_entry(post_transaction_id)
older_entry = get_entry_poller.result()
print(
    f'Contents of {older_entry["entry"]["collectionId"]} at {post_transaction_id}: {older_entry["entry"]["contents"]}'
)

범위가 지정된 쿼리 만들기

원장 항목은 다양한 트랜잭션 ID에 대해 검색할 수 있습니다. 항목은 기본 또는 지정된 컬렉션에서만 반환됩니다.

from azure.confidentialledger import ConfidentialLedgerClient
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient
from azure.identity import DefaultAzureCredential

identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id="my-ledger-id"
)

ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

credential = DefaultAzureCredential()
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name
)

post_poller = ledger_client.begin_create_ledger_entry(
    {"contents": "First message"}
)
first_transaction_id = post_poller.result()["transactionId"]

for i in range(10):
    ledger_client.create_ledger_entry(
        {"contents": f"Message {i}"}
    )

post_poller = ledger_client.begin_create_ledger_entry(
    {"contents": "Last message"}
)
last_transaction_id = post_poller.result()["transactionId"]

ranged_result = ledger_client.list_ledger_entries(
    from_transaction_id=first_transaction_id,
    to_transaction_id=last_transaction_id,
)
for entry in ranged_result:
    print(f'Contents at {entry["transactionId"]}: {entry["contents"]}')

사용자 관리

권한이 있는 Administrator 사용자는 Confidential Ledger 자체를 사용하여 기밀 원장의 사용자를 직접 관리할 수 있습니다. 사용 가능한 역할은 Reader (읽기 전용), Contributor (읽기 및 쓰기) 및 Administrator (읽기, 쓰기 및 사용자 추가 또는 제거)입니다.

from azure.confidentialledger import ConfidentialLedgerClient
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient
from azure.identity import DefaultAzureCredential

identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id="my-ledger-id"
)

ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

credential = DefaultAzureCredential()
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name
)

user_id = "some AAD object id"
user = ledger_client.create_or_update_user(
    user_id, {"assignedRole": "Contributor"}
)
# A client may now be created and used with AAD credentials (i.e. AAD-issued JWT tokens) for the user identified by `user_id`.

user = ledger_client.get_user(user_id)
assert user["userId"] == user_id
assert user["assignedRole"] == "Contributor"

ledger_client.delete_user(user_id)

# For a certificate-based user, their user ID is the fingerprint for their PEM certificate.
user_id = "PEM certificate fingerprint"
user = ledger_client.create_or_update_user(
    user_id, {"assignedRole": "Reader"}
)

user = ledger_client.get_user(user_id)
assert user["userId"] == user_id
assert user["assignedRole"] == "Reader"

ledger_client.delete_user(user_id)

인증서 인증 사용

클라이언트는 Azure Active Directory 토큰을 통해 인증하는 대신 상호 TLS에서 클라이언트 인증서로 인증할 수 있습니다. ConfidentialLedgerCertificateCredential 는 이러한 클라이언트에 대해 제공됩니다.

from azure.confidentialledger import (
    ConfidentialLedgerCertificateCredential,
    ConfidentialLedgerClient,
)
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient

identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id="my-ledger-id"
)

ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

credential = ConfidentialLedgerCertificateCredential(
    certificate_path="Path to user certificate PEM file"
)
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name
)

쓰기 트랜잭션 영수증 확인

클라이언트는 SDK의 영수증 확인 라이브러리를 활용하여 Azure Confidential Legder 인스턴스에서 발급한 쓰기 트랜잭션 영수증을 확인할 수 있습니다. 확인 알고리즘이 기밀 원장 또는 다른 Azure 서비스에 연결될 필요가 없으면 유틸리티를 사용하여 오프라인으로 영수증을 완전히 확인할 수 있습니다.

새 항목이 원장에 추가되면( 이 예제를 참조하세요) 커밋된 쓰기 트랜잭션에 대한 영수증을 받을 수 있습니다.

from azure.confidentialledger import ConfidentialLedgerClient
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient
from azure.identity import DefaultAzureCredential

# Replace this with the Confidential Ledger ID 
ledger_id = "my-ledger-id"

# Setup authentication
credential = DefaultAzureCredential()

# Create a Ledger Certificate client and use it to
# retrieve the service identity for our ledger
identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id=ledger_id
)

# Save ledger service certificate into a file for later use
ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

# Create Confidential Ledger client
ledger_client = ConfidentialLedgerClient(
    endpoint=f"https://{ledger_id}.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name
)

# The method begin_get_receipt returns a poller that
# we can use to wait for the receipt to be available for retrieval 
get_receipt_poller = ledger_client.begin_get_receipt(transaction_id)
get_receipt_result = get_receipt_poller.result()

print(f"Write receipt for transaction id {transaction_id} was successfully retrieved: {get_receipt_result}")

쓰기 트랜잭션에 대한 영수증을 가져온 후 함수를 호출 verify_receipt 하여 영수증이 유효한지 확인할 수 있습니다. 함수는 선택적 애플리케이션 클레임 목록을 수락하여 영수증 클레임 다이제스트에 대해 확인할 수 있습니다.

from azure.confidentialledger.receipt import (
    verify_receipt,
)

# Read contents of service certificate file saved in previous step.
with open(ledger_tls_cert_file_name, "r") as service_cert_file:
    service_cert_content = service_cert_file.read()

# Optionally read application claims, if any
application_claims = get_receipt_result.get("applicationClaims", None) 

try:
    # Verify the contents of the receipt.
    verify_receipt(get_receipt_result["receipt"], service_cert_content, application_claims=application_claims)
    print(f"Receipt for transaction id {transaction_id} successfully verified")
except ValueError:
    print(f"Receipt verification for transaction id {transaction_id} failed")

실행 중인 Confidential Ledger instance 새 항목을 추가하고, 커밋된 트랜잭션에 대한 영수증을 가져오고, 영수증 콘텐츠를 샘플 폴더(get_and_verify_receipt.py)에서 찾을 수 있는지 확인하는 방법을 보여 주는 전체 샘플 Python 프로그램입니다.

비동기 API

이 라이브러리에는 Python 3.5 이상에서 지원되는 완전한 비동기 API가 포함되어 있습니다. 이를 사용하려면 먼저 aiohttp와 같은 비동기 전송을 설치해야 합니다. 자세한 내용은 azure-core 설명서를 참조하세요.

에서 비동기 클라이언트를 azure.confidentialledger.aio가져옵니다. 메서드의 이름과 서명은 동기 클라이언트와 동일합니다. 샘플은 여기에서 찾을 수 있습니다.

문제 해결

일반

기밀 원장 클라이언트는 azure-core에 정의된 예외를 발생합니다. 예를 들어 존재하지 ConfidentialLedgerClient 않는 트랜잭션을 얻으려고 하면 ResourceNotFoundError가 발생합니다.

from azure.core.exceptions import ResourceNotFoundError
from azure.confidentialledger import ConfidentialLedgerClient
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient
from azure.identity import DefaultAzureCredential

identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id="my-ledger-id"
)

ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

credential = DefaultAzureCredential()
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name
)

try:
    ledger_client.begin_get_ledger_entry(
        transaction_id="10000.100000"  # Using a very high id that probably doesn't exist in the ledger if it's relatively new.
    )
except ResourceNotFoundError as e:
    print(e.message)

로깅

이 라이브러리는 로깅에 표준 로깅 라이브러리를 사용합니다. HTTP 세션(URL, 헤더 등)에 대한 기본 정보는 INFO 수준에서 기록됩니다.

요청/응답 본문 및 수정되지 않은 헤더를 포함한 자세한 DEBUG 수준 로깅은 인수를 사용하여 클라이언트 logging_enable 에서 사용하도록 설정할 수 있습니다.

import logging
import sys

from azure.confidentialledger import ConfidentialLedgerClient
from azure.confidentialledger.certificate import ConfidentialLedgerCertificateClient
from azure.identity import DefaultAzureCredential

# Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)

# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

identity_client = ConfidentialLedgerCertificateClient()
network_identity = identity_client.get_ledger_identity(
    ledger_id="my-ledger-id"
)

ledger_tls_cert_file_name = "ledger_certificate.pem"
with open(ledger_tls_cert_file_name, "w") as cert_file:
    cert_file.write(network_identity["ledgerTlsCertificate"])

credential = DefaultAzureCredential()

# This client will log detailed information about its HTTP sessions, at DEBUG level.
ledger_client = ConfidentialLedgerClient(
    endpoint="https://my-ledger-id.confidential-ledger.azure.com",
    credential=credential,
    ledger_certificate_path=ledger_tls_cert_file_name,
    logging_enable=True,
)

마찬가지로 logging_enable은 클라이언트에 대해 상세 로깅을 사용하지 않는 경우에도 한 작업에만 사용하게 설정할 수 있습니다.

ledger_client.get_current_ledger_entry(logging_enable=True)

다음 단계

추가 샘플 코드

이러한 코드 샘플은 Azure Confidential Ledger 클라이언트 라이브러리를 사용하는 일반적인 시나리오 작업을 보여 줍니다.

일반적인 시나리오

고급 시나리오

추가 설명서

Azure Confidential Ledger에 대한 보다 광범위한 설명서는 API 참조 설명서를 참조하세요. Microsoft Research의 오픈 소스 기밀 컨소시엄 프레임워크에 대한 자세한 내용을 참조할 수도 있습니다.

참여

이 프로젝트에 대한 기여와 제안을 환영합니다. 대부분의 경우 기여하려면 권한을 부여하며 실제로 기여를 사용할 권한을 당사에 부여한다고 선언하는 CLA(기여자 라이선스 계약)에 동의해야 합니다. 자세한 내용은 https://cla.microsoft.com 을 참조하세요.

끌어오기 요청을 제출하면 CLA-bot은 CLA를 제공하고 PR을 적절하게 데코레이팅해야 하는지 여부를 자동으로 결정합니다(예: 레이블, 설명). 봇에서 제공하는 지침을 따르기만 하면 됩니다. 이 작업은 CLA를 사용하여 모든 리포지토리에서 한 번만 수행하면 됩니다.

이 프로젝트는 Microsoft 오픈 소스 준수 사항을 채택했습니다. 자세한 내용은 준수 사항 FAQ를 참조하거나 opencode@microsoft.com에 추가 질문 또는 의견을 알려주세요.