вариант
ДомДом Skill DevOps и CI/CD azure-keyvault-certificates-rust

azure-keyvault-certificates-rust

microsoft/skills microsoft/skills

Управляйте сертификатами X.509 в Azure Key Vault из Rust, включая операции создания, удаления и подписания.

...Расширить все
0
Обновлено время 16 сентября 2026 г.

Библиотека Azure Key Vault Certificates для Rust

Управление сертификатами X.509 для TLS/SSL, подписи кода и аутентификации.

Используйте этот инструмент, когда:

  • Приложению необходимо создавать или управлять сертификатами X.509 в Key Vault из кода на Rust
  • Вам нужны самоподписанные или выпущенные центром сертификации (CA) сертификаты
  • Вам требуются длительные операции (LRO) для выпуска сертификатов
  • Вам необходимо подписывать данные с использованием ключа сертификата

ВАЖНО: Используйте только официальный пакет azure_security_keyvault_certificates, опубликованный пользователем azure-sdk на crates.io. НЕ используйте неофициальные или общедоступные пакеты. В названиях официальных пакетов используются символы подчеркивания, и ни один из них не имеет версию 0.21.0.

Установка

cargo add azure_security_keyvault_certificates azure_identity tokio futures

Если ваш код напрямую использует типы azure_core, добавьте azure_core в Cargo.toml. Если вы используете только переопределения из azure_security_keyvault_certificates, прямая зависимость от azure_core является необязательной.

Переменные среды

AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net/ # Требуется для всех операций
</vault-name>

Аутентификация

use azure_identity::DeveloperToolsCredential;
use azure_security_keyvault_certificates::CertificateClient;

#[tokio::main]
async fn main() -> Result> {
    // Локальная разработка: DeveloperToolsCredential. Для production: используйте ManagedIdentityCredential.
    let credential = DeveloperToolsCredential::new(None)?;
    let client = CertificateClient::new(
        "https://<vault-name>.vault.azure.net/",
        credential.clone(),
        None,
    )?;

    let cert = client
        .get_certificate("cert-name", None)
        .await?
        .into_model()?;
    println!("Certificate: {:?}", cert.id);
    Ok(())
}
</vault-name>

Основной рабочий процесс

Создание самоподписанного сертификата (LRO)

Создание сертификата является длительной операцией. Poller<t></t> реализует IntoFuture — просто используйте .await:

use azure_security_keyvault_certificates::{
    models::{
        CertificatePolicy, CreateCertificateParameters, IssuerParameters,
        X509CertificateProperties,
    },
    ResourceExt,
};

let policy = CertificatePolicy {
    x509_certificate_properties: Some(X509CertificateProperties {
        subject: Some("CN=example.com".into()),
        ..Default::default()
    }),
    issuer_parameters: Some(IssuerParameters {
        name: Some("Self".into()),
        ..Default::default()
    }),
    ..Default::default()
};
let body = CreateCertificateParameters {
    certificate_policy: Some(policy),
    ..Default::default()
};

// Poller реализует IntoFuture — используйте await напрямую для завершения
let cert = client
    .begin_create_certificate("cert-name", body.try_into()?, None)?
    .await?
    .into_model()?;

println!(
    "Name: {:?}, Version: {:?}",
    cert.resource_id()?.name,
    cert.resource_id()?.version,
);

Обновление свойств сертификата

use azure_security_keyvault_certificates::models::UpdateCertificatePropertiesParameters;
use std::collections::HashMap;

#[allow(clippy::needless_update)]
let params = UpdateCertificatePropertiesParameters {
    tags: Some(HashMap::from_iter(vec![("env".into(), "prod".into())])),
    ..Default::default()
};

client
    .update_certificate_properties("cert-name", params.try_into()?, None)
    .await?
    .into_model()?;

Удаление сертификата

client.delete_certificate("cert-name", None).await?;

Список сертификатов (пагинация)

list_certificate_properties возвращает Pager<t></t> — перебирайте элементы напрямую:

use azure_security_keyvault_certificates::ResourceExt;
use futures::TryStreamExt as _;

let mut pager = client.list_certificate_properties(None)?;
while let Some(cert) = pager.try_next().await? {
    println!("Found: {}", cert.resource_id()?.name);
}

Подписание с использованием ключа сертификата

Сертификаты в Key Vault имеют связанный с ними ключ. Используйте SDK Key Vault Keys для криптографических операций:


use azure_security_keyvault_keys::{
    models::{KeyClientSignOptions, SignParameters, SignatureAlgorithm},
    KeyClient,
};

let key_client = KeyClient::new(
    "https://<vault-name>.vault.azure.net/",
    credential.clone(),
    None,
)?;

// Подписание с использованием EC-ключа сертификата
let digest = vec![0u8; 32]; // дайджест SHA-256
let body = SignParameters {
    algorithm: Some(SignatureAlgorithm::Es256),
    value: Some(digest),
};

let result = key_client
    .sign(
        "cert-name",
        body.try_into()?,
        Some(KeyClientSignOptions {
            key_version: Some("<certificate-version>".to_string()),
            ..Default::default()
        }),
    )
    .await?
    .into_model()?;
println!("Signature: {:?}", result.result);
</certificate-version></vault-name>

Форматы сертификатов
-------------------

<table><thead><tr><th>Формат</th><th>Тип содержимого</th><th>Сценарий использования</th></tr></thead><tbody><tr><td>PKCS#12</td><td>`application/x-pkcs12`</td><td>Связанный сертификат + закрытый ключ</td></tr><tr><td>PEM</td><td>`application/x-pem-file`</td><td>Base64-кодирование, распространено в Linux/веб</td></tr></tbody></table>

Роли RBAC
----------

Для аутентификации через Entra ID назначьте одну из следующих ролей:

<table><thead><tr><th>Роль</th><th>Доступ</th></tr></thead><tbody><tr><td>`Key Vault Certificate User`</td><td>Использование сертификатов</td></tr><tr><td>`Key Vault Certificates Officer`</td><td>Полное управление сертификатами</td></tr></tbody></table>

Рекомендации
--------------

1. **Используйте `cargo add` для управления зависимостями, никогда не редактируйте `Cargo.toml` напрямую.** Добавляйте и удаляйте зависимости SDK Rust с помощью команд cargo вместо ручного редактирования манифеста.
2. **Добавляйте `azure_core` только при прямом импорте типов `azure_core`.** Если ваш код импортирует `azure_core::http::Url`, `azure_core::http::RequestContent` или `azure_core::error::ErrorKind`, включите `azure_core`; в противном случае прямая зависимость является необязательной.
3. **Используйте `DeveloperToolsCredential`** для локальной разработки, **`ManagedIdentityCredential`** для production — в Rust не предусмотрен единый тип `DefaultAzureCredential`
4. **Никогда не храните учетные данные в коде** — используйте переменные среды или управляемую идентичность
5. **Используйте `..Default::default()`** с `#[allow(clippy::needless_update)]` для обновления структур моделей
6. **Используйте `ResourceExt`** для извлечения имени/версии сертификата из идентификаторов
7. **LRO** — `begin_create_certificate` возвращает `Poller`; просто используйте `.await` для завершения (клиентам редко требуется опрашивать статус)
8. **Переиспользуйте клиенты** — `CertificateClient` является потокобезопасным; создавайте один раз и разделяйте между задачами

Ссылки на справочные материалы
---------------

<table><thead><tr><th>Ресурс</th><th>Ссылка</th></tr></thead><tbody><tr><td>Справочник по API</td><td>https://docs.rs/azure\_security\_keyvault\_certificates/latest/azure\_security\_keyvault\_certificates</td></tr><tr><td>crates.io</td><td>https://crates.io/crates/azure\_security\_keyvault\_certificates</td></tr><tr><td>Исходный код</td><td>https://github.com/Azure/azure-sdk-for-rust/tree/main/sdk/keyvault/azure\_security\_keyvault\_certificates</td></tr></tbody></table>
Посмотреть на GitHub
---
name: azure-keyvault-certificates-rust
description: Manage X.509 certificates in Azure Key Vault from Rust, including creation, deletion, and signing operations.
license: MIT
---

# Azure Key Vault Certificates library for Rust

Manage X.509 certificates for TLS/SSL, code signing, and authentication.

Use this skill when:

- An app needs to create or manage X.509 certificates in Key Vault from Rust
- You need self-signed or CA-issued certificates
- You need long-running operations (LRO) for certificate issuance
- You need to sign data using a certificate's key

> **IMPORTANT:** Only use the official `azure_security_keyvault_certificates` crate published by the [azure-sdk](https://crates.io/users/azure-sdk) crates.io user. Do NOT use unofficial or community crates. Official crates use underscores in names and none have version 0.21.0.

## Installation

```sh
cargo add azure_security_keyvault_certificates azure_identity tokio futures
```

> If your code uses `azure_core` types directly, add `azure_core` to `Cargo.toml`. If you only use `azure_security_keyvault_certificates` re-exports, direct `azure_core` dependency is optional.

## Environment Variables

```bash
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net/ # Required for all operations
```

## Authentication

```rust
use azure_identity::DeveloperToolsCredential;
use azure_security_keyvault_certificates::CertificateClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Local dev: DeveloperToolsCredential. Production: use ManagedIdentityCredential.
    let credential = DeveloperToolsCredential::new(None)?;
    let client = CertificateClient::new(
        "https://<vault-name>.vault.azure.net/",
        credential.clone(),
        None,
    )?;

    let cert = client
        .get_certificate("cert-name", None)
        .await?
        .into_model()?;
    println!("Certificate: {:?}", cert.id);
    Ok(())
}
```

## Core Workflow

### Create Self-Signed Certificate (LRO)

Creating a certificate is a long-running operation. `Poller<T>` implements `IntoFuture` — just `.await`:

```rust
use azure_security_keyvault_certificates::{
    models::{
        CertificatePolicy, CreateCertificateParameters, IssuerParameters,
        X509CertificateProperties,
    },
    ResourceExt,
};

let policy = CertificatePolicy {
    x509_certificate_properties: Some(X509CertificateProperties {
        subject: Some("CN=example.com".into()),
        ..Default::default()
    }),
    issuer_parameters: Some(IssuerParameters {
        name: Some("Self".into()),
        ..Default::default()
    }),
    ..Default::default()
};
let body = CreateCertificateParameters {
    certificate_policy: Some(policy),
    ..Default::default()
};

// Poller implements IntoFuture — await directly for completion
let cert = client
    .begin_create_certificate("cert-name", body.try_into()?, None)?
    .await?
    .into_model()?;

println!(
    "Name: {:?}, Version: {:?}",
    cert.resource_id()?.name,
    cert.resource_id()?.version,
);
```

### Update Certificate Properties

```rust
use azure_security_keyvault_certificates::models::UpdateCertificatePropertiesParameters;
use std::collections::HashMap;

#[allow(clippy::needless_update)]
let params = UpdateCertificatePropertiesParameters {
    tags: Some(HashMap::from_iter(vec![("env".into(), "prod".into())])),
    ..Default::default()
};

client
    .update_certificate_properties("cert-name", params.try_into()?, None)
    .await?
    .into_model()?;
```

### Delete Certificate

```rust
client.delete_certificate("cert-name", None).await?;
```

### List Certificates (Pagination)

`list_certificate_properties` returns a `Pager<T>` — iterate items directly:

```rust
use azure_security_keyvault_certificates::ResourceExt;
use futures::TryStreamExt as _;

let mut pager = client.list_certificate_properties(None)?;
while let Some(cert) = pager.try_next().await? {
    println!("Found: {}", cert.resource_id()?.name);
}
```

## Signing with a Certificate's Key

Certificates in Key Vault have an associated key. Use the Key Vault Keys SDK for crypto operations:

```rust
use azure_security_keyvault_keys::{
    models::{KeyClientSignOptions, SignParameters, SignatureAlgorithm},
    KeyClient,
};

let key_client = KeyClient::new(
    "https://<vault-name>.vault.azure.net/",
    credential.clone(),
    None,
)?;

// Sign with the certificate's EC key
let digest = vec![0u8; 32]; // SHA-256 digest
let body = SignParameters {
    algorithm: Some(SignatureAlgorithm::Es256),
    value: Some(digest),
};

let result = key_client
    .sign(
        "cert-name",
        body.try_into()?,
        Some(KeyClientSignOptions {
            key_version: Some("<certificate-version>".to_string()),
            ..Default::default()
        }),
    )
    .await?
    .into_model()?;
println!("Signature: {:?}", result.result);
```

## Certificate Formats

| Format  | Content Type             | Use Case                            |
| ------- | ------------------------ | ----------------------------------- |
| PKCS#12 | `application/x-pkcs12`   | Bundled cert + private key          |
| PEM     | `application/x-pem-file` | Base64-encoded, common in Linux/web |

## RBAC Roles

For Entra ID auth, assign one of these roles:

| Role                             | Access                      |
| -------------------------------- | --------------------------- |
| `Key Vault Certificate User`     | Use certificates            |
| `Key Vault Certificates Officer` | Full certificate management |

## Best Practices

1. **Use `cargo add` to manage dependencies, never edit `Cargo.toml` directly.** Add and remove Rust SDK dependencies with cargo commands instead of manual manifest edits.
2. **Add `azure_core` only when importing `azure_core` types directly.** If your code imports `azure_core::http::Url`, `azure_core::http::RequestContent`, or `azure_core::error::ErrorKind`, include `azure_core`; otherwise a direct dependency is optional.
3. **Use `DeveloperToolsCredential`** for local dev, **`ManagedIdentityCredential`** for production — Rust does not provide a single `DefaultAzureCredential` type
4. **Never hardcode credentials** — use environment variables or managed identity
5. **Use `..Default::default()`** with `#[allow(clippy::needless_update)]` for model struct updates
6. **Use `ResourceExt`** to extract certificate name/version from IDs
7. **LROs** — `begin_create_certificate` returns a `Poller`; just `.await` for completion (clients should rarely poll for status)
8. **Reuse clients** — `CertificateClient` is thread-safe; create once, share across tasks

## Reference Links

| Resource      | Link                                                                                                    |
| ------------- | ------------------------------------------------------------------------------------------------------- |
| API Reference | https://docs.rs/azure_security_keyvault_certificates/latest/azure_security_keyvault_certificates        |
| crates.io     | https://crates.io/crates/azure_security_keyvault_certificates                                           |
| Source Code   | https://github.com/Azure/azure-sdk-for-rust/tree/main/sdk/keyvault/azure_security_keyvault_certificates |

Все файлы

1 файлов

Установить azure-keyvault-certificates-rust

Скачайте и извлеките файлы навыков в директорию .claude/skills/.

Скачать ZIP

Клонируйте репозиторий и скопируйте файлы навыка в свой проект.

git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-rust/skills/azure-keyvault-certificates-rust # Copy SKILL.md to your .claude/skills/ directory

Копировать Копировать
Быстрая настройка: Скопируйте папку навыка в .claude/skills/ Claude автоматически обнаружит и использует этот навык
Репозиторий microsoft/skills

Похожие навыки

base44-cli
Обновлено время 29 июня 2026 г.
klingai-upgrade-migration
Обновлено время 3 июля 2026 г.
Railway CLI Management
Обновлено время 2 июля 2026 г.
Verification &amp; Quality Assurance
Обновлено время 29 июня 2026 г.
OR