bool AwsDoc::ACM::DescribeCertificate()

in cpp/example_code/acm/acm_basic_operations.cpp [167:689]


bool AwsDoc::ACM::DescribeCertificate(const Aws::String& certificateArn,
    const Aws::String& region)
{
    Aws::Client::ClientConfiguration config;
    config.region = region;

    Aws::ACM::ACMClient acm_client(config);

    Aws::ACM::Model::DescribeCertificateRequest request;
    request.WithCertificateArn(certificateArn);

    Aws::ACM::Model::DescribeCertificateOutcome outcome =
        acm_client.DescribeCertificate(request);

    if (!outcome.IsSuccess())
    {
        std::cout << "Error: DescribeCertificate: " << 
            outcome.GetError().GetMessage() << std::endl;

        return false;
    }
    else
    {
        Aws::ACM::Model::CertificateDetail certificate =
            outcome.GetResult().GetCertificate();

        std::cout << "Success: Information about certificate " 
            "with ARN '" << certificateArn << "':" << std::endl << std::endl;

        std::cout << "ARN:                 " << certificate.GetCertificateArn() 
            << std::endl;
        std::cout << "Authority ARN:       " << 
            certificate.GetCertificateAuthorityArn() << std::endl;
        std::cout << "Created at (GMT):    " << 
            certificate.GetCreatedAt().ToGmtString(Aws::Utils::DateFormat::ISO_8601) 
            << std::endl;
        std::cout << "Domain name:         " << certificate.GetDomainName() 
            << std::endl;
        
        Aws::Vector<Aws::ACM::Model::DomainValidation> options = 
            certificate.GetDomainValidationOptions();

        if (options.size() > 0)
        {
            std::cout << std::endl << "Domain validation information: " 
                << std::endl << std::endl;

            for (auto it = options.begin(); it != options.end(); it++)
            {
                Aws::ACM::Model::DomainValidation validation = *it;

                std::cout << "  Domain name:              " << 
                    validation.GetDomainName() << std::endl;

                Aws::ACM::Model::ResourceRecord record = 
                    validation.GetResourceRecord();

                std::cout << "  Resource record name:     " << 
                    record.GetName() << std::endl;

                Aws::ACM::Model::RecordType record_type = record.GetType();
                Aws::String type;

                switch (record_type)
                {
                case Aws::ACM::Model::RecordType::CNAME:
                    type = "CNAME";
                    break;
                case Aws::ACM::Model::RecordType::NOT_SET:
                    type = "Not set";
                    break;
                default:
                    type = "Cannot determine.";
                    break;
                }

                std::cout << "  Resource record type:     " << type << 
                    std::endl;

                std::cout << "  Resource record value:    " << 
                    record.GetValue() << std::endl;

                std::cout << "  Validation domain:        " << 
                    validation.GetValidationDomain() << std::endl;

                Aws::Vector<Aws::String> emails = 
                    validation.GetValidationEmails();

                if (emails.size() > 0)
                {
                    std::cout << "  Validation emails:" << std::endl << 
                        std::endl;

                    for (auto it = emails.begin(); it != emails.end(); it++)
                    {
                        Aws::String email = *it;
                        std::cout << "    " << email << std::endl;
                    }

                    std::cout << std::endl;
                }

                Aws::ACM::Model::ValidationMethod validation_method = 
                    validation.GetValidationMethod();
                Aws::String method;
                
                switch (validation_method)
                {
                case Aws::ACM::Model::ValidationMethod::DNS:
                    method = "DNS";
                    break;
                case Aws::ACM::Model::ValidationMethod::EMAIL:
                    method = "Email";
                    break;
                case Aws::ACM::Model::ValidationMethod::NOT_SET:
                    method = "Not set";
                    break;
                default:
                    method = "Cannot determine";
                }

                std::cout << "  Validation method:        " << 
                    method << std::endl;

                Aws::ACM::Model::DomainStatus domain_status = 
                    validation.GetValidationStatus();
                Aws::String status; 

                switch (domain_status)
                {
                case Aws::ACM::Model::DomainStatus::FAILED:
                    status = "Failed";
                    break;
                case Aws::ACM::Model::DomainStatus::NOT_SET:
                    status = "Not set";
                    break;
                case Aws::ACM::Model::DomainStatus::PENDING_VALIDATION:
                    status = "Pending validation";
                    break;
                case Aws::ACM::Model::DomainStatus::SUCCESS:
                    status = "Success";
                    break;
                default:
                    status = "Cannot determine";
                }

                std::cout << "  Domain validation status: " << status << 
                    std::endl << std::endl;
                
            }
        }

        Aws::Vector<Aws::ACM::Model::ExtendedKeyUsage> usages = 
            certificate.GetExtendedKeyUsages();

        if (usages.size() > 0)
        {
            std::cout << std::endl << "Extended key usages:" << 
                std::endl << std::endl;

            for (auto it = usages.begin(); it != usages.end(); it++)
            {
                Aws::ACM::Model::ExtendedKeyUsage usage = *it;

                Aws::ACM::Model::ExtendedKeyUsageName usage_name = 
                    usage.GetName();
                Aws::String name;

                switch (usage_name)
                {
                case Aws::ACM::Model::ExtendedKeyUsageName::ANY:
                    name = "Any";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::CODE_SIGNING:
                    name = "Code signing";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::CUSTOM:
                    name = "Custom";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::EMAIL_PROTECTION:
                    name = "Email protection";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::IPSEC_END_SYSTEM:
                    name = "IPSEC end system";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::IPSEC_TUNNEL:
                    name = "IPSEC tunnel";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::IPSEC_USER:
                    name = "IPSEC user";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::NONE:
                    name = "None";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::NOT_SET:
                    name = "Not set";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::OCSP_SIGNING:
                    name = "OCSP signing";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::TIME_STAMPING:
                    name = "Time stamping";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::TLS_WEB_CLIENT_AUTHENTICATION:
                    name = "TLS web client authentication";
                    break;
                case Aws::ACM::Model::ExtendedKeyUsageName::TLS_WEB_SERVER_AUTHENTICATION:
                    name = "TLS web server authentication";
                    break;
                default:
                    name = "Cannot determine";
                }

                std::cout << "  Name: " << name << std::endl;
                std::cout << "  OID:  " << usage.GetOID() << 
                    std::endl << std::endl;
            }

            std::cout << std::endl;
        }
        
        Aws::ACM::Model::CertificateStatus certificate_status = 
            certificate.GetStatus();
        Aws::String status;

        switch (certificate_status)
        {
        case Aws::ACM::Model::CertificateStatus::EXPIRED:
            status = "Expired";
            break;
        case Aws::ACM::Model::CertificateStatus::FAILED:
            status = "Failed";
            break;
        case Aws::ACM::Model::CertificateStatus::INACTIVE:
            status = "Inactive";
            break;
        case Aws::ACM::Model::CertificateStatus::ISSUED:
            status = "Issued";
            break;
        case Aws::ACM::Model::CertificateStatus::NOT_SET:
            status = "Not set";
            break;
        case Aws::ACM::Model::CertificateStatus::PENDING_VALIDATION:
            status = "Pending validation";
            break;
        case Aws::ACM::Model::CertificateStatus::REVOKED:
            status = "Revoked";
            break;
        case Aws::ACM::Model::CertificateStatus::VALIDATION_TIMED_OUT:
            status = "Validation timed out";
            break;
        default:
            status = "Cannot determine";
        }

        std::cout << "Status:              " << status << std::endl;

        if (certificate.GetStatus() == 
            Aws::ACM::Model::CertificateStatus::FAILED)
        {
            Aws::ACM::Model::FailureReason failure_reason = 
                certificate.GetFailureReason();
            Aws::String reason;

            switch (failure_reason)
            {
            case Aws::ACM::Model::FailureReason::ADDITIONAL_VERIFICATION_REQUIRED:
                reason = "Additional verification required";
                break;
            case Aws::ACM::Model::FailureReason::CAA_ERROR:
                reason = "CAA error";
                break;
            case Aws::ACM::Model::FailureReason::DOMAIN_NOT_ALLOWED:
                reason = "Domain not allowed";
                break;
            case Aws::ACM::Model::FailureReason::DOMAIN_VALIDATION_DENIED:
                reason = "Domain validation denied";
                break;
            case Aws::ACM::Model::FailureReason::INVALID_PUBLIC_DOMAIN:
                reason = "Invalid public domain";
                break;
            case Aws::ACM::Model::FailureReason::NOT_SET:
                reason = "Not set";
                break;
            case Aws::ACM::Model::FailureReason::NO_AVAILABLE_CONTACTS:
                reason = "No available contacts";
                break;
            case Aws::ACM::Model::FailureReason::OTHER:
                reason = "Other";
                break;
            case Aws::ACM::Model::FailureReason::PCA_ACCESS_DENIED:
                reason = "PCA access denied";
                break;
            case Aws::ACM::Model::FailureReason::PCA_INVALID_ARGS:
                reason = "PCA invalid args";
                break;
            case Aws::ACM::Model::FailureReason::PCA_INVALID_ARN:
                reason = "PCA invalid ARN";
                break;
            case Aws::ACM::Model::FailureReason::PCA_INVALID_DURATION:
                reason = "PCA invalid duration";
                break;
            case Aws::ACM::Model::FailureReason::PCA_INVALID_STATE:
                reason = "PCA invalid state";
                break;
            case Aws::ACM::Model::FailureReason::PCA_LIMIT_EXCEEDED:
                reason = "PCA limit exceeded";
                break;
            case Aws::ACM::Model::FailureReason::PCA_NAME_CONSTRAINTS_VALIDATION:
                reason = "PCA name constraints validation";
                break;
            case Aws::ACM::Model::FailureReason::PCA_REQUEST_FAILED:
                reason = "PCA request failed";
                break;
            case Aws::ACM::Model::FailureReason::PCA_RESOURCE_NOT_FOUND:
                reason = "PCA resource not found";
                break;
            default:
                reason = "Cannot determine";
            }

            std::cout << "Failure reason:      " << reason << std::endl;
        } 
        
        if (certificate.GetStatus() == Aws::ACM::Model::CertificateStatus::REVOKED)
        {
            std::cout << "Revoked at (GMT):    " <<
                certificate.GetRevokedAt().ToGmtString(Aws::Utils::DateFormat::ISO_8601)
                << std::endl;
            
            Aws::ACM::Model::RevocationReason revocation_reason = 
                certificate.GetRevocationReason();
            Aws::String reason;

            switch (revocation_reason)
            {
            case Aws::ACM::Model::RevocationReason::AFFILIATION_CHANGED:
                reason = "Affiliation changed";
                break;
            case Aws::ACM::Model::RevocationReason::A_A_COMPROMISE:
                reason = "AA compromise";
                break;
            case Aws::ACM::Model::RevocationReason::CA_COMPROMISE:
                reason = "CA compromise";
                break;
            case Aws::ACM::Model::RevocationReason::CERTIFICATE_HOLD:
                reason = "Certificate hold";
                break;
            case Aws::ACM::Model::RevocationReason::CESSATION_OF_OPERATION:
                reason = "Cessation of operation";
                break;
            case Aws::ACM::Model::RevocationReason::KEY_COMPROMISE:
                reason = "Key compromise";
                break;
            case Aws::ACM::Model::RevocationReason::NOT_SET:
                reason = "Not set";
                break;
            case Aws::ACM::Model::RevocationReason::PRIVILEGE_WITHDRAWN:
                reason = "Privilege withdrawn";
                break;
            case Aws::ACM::Model::RevocationReason::REMOVE_FROM_CRL:
                reason = "Revoke from CRL";
                break;
            case Aws::ACM::Model::RevocationReason::SUPERCEDED:
                reason = "Superceded";
                break;
            case Aws::ACM::Model::RevocationReason::UNSPECIFIED:
                reason = "Unspecified";
                break;
            default:
                reason = "Cannot determine";
            }

            std::cout << "Revocation reason:   " << reason << std::endl;
        }

        if (certificate.GetType() == Aws::ACM::Model::CertificateType::IMPORTED)
        {
            std::cout << "Imported at (GMT):   " <<
                certificate.GetImportedAt().ToGmtString(Aws::Utils::DateFormat::ISO_8601) 
                << std::endl;
        }
        
        Aws::Vector<Aws::String> in_use_bys = certificate.GetInUseBy();

        if (in_use_bys.size() > 0)
        {
            std::cout << std::endl << "In use by:" << std::endl << std::endl;

            for (auto it = in_use_bys.begin(); it != in_use_bys.end(); it++)
            {
                Aws::String in_use_by = *it;
                std::cout << "  " << in_use_by << std::endl;
            }

            std::cout << std::endl;
        }
        
        if (certificate.GetType() == Aws::ACM::Model::CertificateType::AMAZON_ISSUED && 
            certificate.GetStatus() == Aws::ACM::Model::CertificateStatus::ISSUED)
        {
            std::cout << "Issued at (GMT):     " << 
                certificate.GetIssuedAt().ToGmtString(Aws::Utils::DateFormat::ISO_8601) 
                << std::endl;
        }
        
        std::cout << "Issuer:              " << certificate.GetIssuer() << 
            std::endl;
        
        Aws::ACM::Model::KeyAlgorithm key_algorithm = 
            certificate.GetKeyAlgorithm();
        Aws::String algorithm;

        switch (key_algorithm)
        {
        case Aws::ACM::Model::KeyAlgorithm::EC_prime256v1:
            algorithm = "P-256 (secp256r1, prime256v1)";
            break;
        case Aws::ACM::Model::KeyAlgorithm::EC_secp384r1:
            algorithm = "P-384 (secp384r1)";
            break;
        case Aws::ACM::Model::KeyAlgorithm::EC_secp521r1:
            algorithm = "P-521 (secp521r1)";
            break;
        case Aws::ACM::Model::KeyAlgorithm::NOT_SET:
            algorithm = "Not set";
            break;
        case Aws::ACM::Model::KeyAlgorithm::RSA_1024:
            algorithm = "RSA 1024";
            break;
        case Aws::ACM::Model::KeyAlgorithm::RSA_2048:
            algorithm = "RSA 2048";
            break;
        case Aws::ACM::Model::KeyAlgorithm::RSA_4096:
            algorithm = "RSA 4096";
            break;
        default:
            algorithm = "Cannot determine";
        }

        std::cout << "Key algorithm:       " << algorithm << std::endl;
        
        if (certificate.GetStatus() == Aws::ACM::Model::CertificateStatus::ISSUED)
        {
            std::cout << "Not valid after (GMT): " <<
                certificate.GetNotAfter().ToGmtString(Aws::Utils::DateFormat::ISO_8601)
                << std::endl;
            std::cout << "Not valid before (GMT): " <<
                certificate.GetNotBefore().ToGmtString(Aws::Utils::DateFormat::ISO_8601)
                << std::endl;
        }
        
        Aws::ACM::Model::CertificateTransparencyLoggingPreference logging_preference = 
            certificate.GetOptions().GetCertificateTransparencyLoggingPreference();
        Aws::String preference;

        switch (logging_preference)
        {
        case Aws::ACM::Model::CertificateTransparencyLoggingPreference::DISABLED:
            preference = "Disabled";
            break;
        case Aws::ACM::Model::CertificateTransparencyLoggingPreference::ENABLED:
            preference = "Enabled";
            break;
        case Aws::ACM::Model::CertificateTransparencyLoggingPreference::NOT_SET:
            preference = "Not set";
            break;
        default:
            preference = "Cannot determine";
        }
        
        std::cout << "Logging preference:  " << preference << std::endl;

        std::cout << "Serial:              " << certificate.GetSerial() << 
            std::endl;
        std::cout << "Signature algorithm: " 
            << certificate.GetSignatureAlgorithm() << std::endl;
        std::cout << "Subject:             " << certificate.GetSubject() << 
            std::endl;
        
        Aws::ACM::Model::CertificateType certificate_type = certificate.GetType();
        Aws::String type;

        switch (certificate_type)
        {
        case Aws::ACM::Model::CertificateType::AMAZON_ISSUED:
            type = "Amazon issued";
            break;
        case Aws::ACM::Model::CertificateType::IMPORTED:
            type = "Imported";
            break;
        case Aws::ACM::Model::CertificateType::NOT_SET:
            type = "Not set";
            break;
        case Aws::ACM::Model::CertificateType::PRIVATE_:
            type = "Private";
            break;
        default:
            type = "Cannot determine";
        }

        std::cout << "Type:                " << type << std::endl;

        Aws::Vector<Aws::String> alt_names = 
            certificate.GetSubjectAlternativeNames();

        if (alt_names.size() > 0)
        {
            std::cout << std::endl << "Alternative names:" << 
                std::endl << std::endl;

            for (auto it = alt_names.begin(); it != alt_names.end(); it++)
            {
                Aws::String alt_name = *it;
                std::cout << "  " << alt_name << std::endl;
            }

            std::cout << std::endl;
        }

        return true;
    }
}