azure-keyvault-certificates-rust
microsoft/skills
Управляйте сертификатами X.509 в Azure Key Vault из Rust, включая операции создания, удаления и подписания.
...Расширить всеБиблиотека 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> ---
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
Копировать





Дом
