azure-sdk-for-cpp/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate-get-certificates/certificate_get_certificates.cpp
George Arama bd08d226e1
relocate kv samples (#5582)
* relocate kv samples

* temp removal of links
2024-04-30 22:09:49 +00:00

176 lines
6.3 KiB
C++

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
/**
*
* @brief This sample provides examples of handling paged operations.
* @details This sample provides the code implementation to use the Key Vault Certificates SDK
* client for C++ to create, get properties of certificates, get properties of certificate versions,
* delete , get deleted certificates, purge
*
* @remark The following environment variables must be set before running the sample.
* - AZURE_KEYVAULT_URL: To the Key Vault account URL.
* - AZURE_TENANT_ID: Tenant ID for the Azure account.
* - AZURE_CLIENT_ID: The Client ID to authenticate the request.
* - AZURE_CLIENT_SECRET: The client secret.
*
*/
#include <azure/identity.hpp>
#include <azure/keyvault/certificates.hpp>
#include <chrono>
#include <iostream>
#include <thread>
using namespace Azure::Security::KeyVault::Certificates;
using namespace std::chrono_literals;
KeyVaultCertificateWithPolicy CreateCertificate(
std::string const& certificateName,
CertificateClient const& certificateClient);
int main()
{
auto tenantId = std::getenv("AZURE_TENANT_ID");
auto clientId = std::getenv("AZURE_CLIENT_ID");
auto clientSecret = std::getenv("AZURE_CLIENT_SECRET");
auto credential
= std::make_shared<Azure::Identity::ClientSecretCredential>(tenantId, clientId, clientSecret);
std::chrono::milliseconds defaultWait(10s);
// create client
CertificateClient certificateClient(std::getenv("AZURE_KEYVAULT_URL"), credential);
try
{
std::string certificateName1 = "SampleCertificate1";
std::string certificateName2 = "SampleCertificate2";
KeyVaultCertificateWithPolicy certificate1;
KeyVaultCertificateWithPolicy certificate2;
// create and get two certificates
{
// create certificates
certificate1 = CreateCertificate(certificateName1, certificateClient);
certificate2 = CreateCertificate(certificateName2, certificateClient);
// get properties of certificates
for (auto certificates = certificateClient.GetPropertiesOfCertificates();
certificates.HasPage();
certificates.MoveToNextPage())
{ // go through every certificate of each page returned
// the number of results returned for in a page is not guaranteed
// it can be anywhere from 0 to 25
std::cout << "Found " << certificates.Items.size() << " certificates.";
for (auto oneCertificate : certificates.Items)
{
std::cout << "Certificate name : " << oneCertificate.Name;
}
}
}
// certificate versions, and get versions
{
// create new version of certificate
CreateCertificate(certificateName1, certificateClient);
// get properties of all the versions of a certificate
for (auto certificateVersions
= certificateClient.GetPropertiesOfCertificateVersions(certificateName1);
certificateVersions.HasPage();
certificateVersions.MoveToNextPage())
{ // go through every certificate of each page returned
// the number of results returned for in a page is not guaranteed
// it can be anywhere from 0 to 25
std::cout << "Found " << certificateVersions.Items.size()
<< " certificate versions for certificate " << certificateName1;
}
}
// delete the certificates, and get deleted
{
// delete the certificates
auto response1 = certificateClient.StartDeleteCertificate(certificateName1);
auto response2 = certificateClient.StartDeleteCertificate(certificateName2);
response1.PollUntilDone(defaultWait);
response2.PollUntilDone(defaultWait);
// get properties of deleted certificates
for (auto deletedCertificates = certificateClient.GetDeletedCertificates();
deletedCertificates.HasPage();
deletedCertificates.MoveToNextPage())
{ // go through every certificate of each page returned
// the number of results returned for in a page is not guaranteed
// it can be anywhere from 0 to 25
std::cout << "Found " << deletedCertificates.Items.size() << " deleted certificates.";
}
}
// purge the certificates
{
certificateClient.PurgeDeletedCertificate(certificateName1);
certificateClient.PurgeDeletedCertificate(certificateName2);
}
}
catch (Azure::Core::Credentials::AuthenticationException const& e)
{
std::cout << "Authentication Exception happened:" << std::endl << e.what() << std::endl;
return 1;
}
catch (Azure::Core::RequestFailedException const& e)
{
std::cout << "Key Vault Certificate Client Exception happened:" << std::endl
<< e.Message << std::endl;
return 1;
}
return 0;
}
KeyVaultCertificateWithPolicy CreateCertificate(
std::string const& certificateName,
CertificateClient const& certificateClient)
{
CertificateCreateOptions options;
std::chrono::milliseconds defaultWait(10s);
// setup certificate create properties/policy
{
// create a lifetime action
LifetimeAction action;
action.LifetimePercentage = 80;
action.Action = CertificatePolicyAction::AutoRenew;
// setup properties
options.Properties.Enabled = true;
// setup policy
options.Policy.Subject = "CN=sample1";
options.Policy.ValidityInMonths = 12;
options.Policy.Enabled = true;
options.Policy.ContentType = CertificateContentType::Pkcs12;
options.Policy.IssuerName = "Self";
// add a lifetime action
options.Policy.LifetimeActions.emplace_back(action);
}
// create a certificate
{
options.Properties.Name = certificateName;
// start the create process
auto response = certificateClient.StartCreateCertificate(certificateName, options);
// wait for complete to get the certificate
auto pollResponse = response.PollUntilDone(defaultWait).Value;
// check the status of the poll response
if (!pollResponse.Error && pollResponse.Status.HasValue()
&& pollResponse.Status.Value() == "completed")
{
// get the certificate
auto certificate = certificateClient.GetCertificate(certificateName).Value;
std::cout << "Created certificate with policy. Certificate name : " << certificate.Name();
return certificate;
}
else
{
throw std::runtime_error(
"Create certificate with policy result : " + pollResponse.Status.Value());
}
}
}