361 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			361 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | """Unit tests for acmpca-supported APIs.""" | ||
|  | import boto3 | ||
|  | import pytest | ||
|  | import sure  # noqa # pylint: disable=unused-import | ||
|  | from botocore.exceptions import ClientError | ||
|  | from moto import mock_acmpca | ||
|  | from moto.core import DEFAULT_ACCOUNT_ID | ||
|  | 
 | ||
|  | import datetime | ||
|  | import cryptography.x509 | ||
|  | from cryptography.x509 import NameOID | ||
|  | import cryptography.hazmat.primitives.asymmetric.rsa | ||
|  | from cryptography.hazmat.primitives import serialization, hashes | ||
|  | from cryptography.hazmat.backends import default_backend | ||
|  | 
 | ||
|  | # See our Development Tips on writing tests for hints on how to write good tests: | ||
|  | # http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_create_certificate_authority(): | ||
|  |     client = boto3.client("acm-pca", region_name="eu-west-1") | ||
|  |     resp = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |         IdempotencyToken="terraform-20221125230308947400000001", | ||
|  |     ) | ||
|  | 
 | ||
|  |     resp.should.have.key("CertificateAuthorityArn").match( | ||
|  |         f"^arn:aws:acm-pca:eu-west-1:{DEFAULT_ACCOUNT_ID}:certificate-authority/" | ||
|  |     ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_describe_certificate_authority(): | ||
|  |     client = boto3.client("acm-pca", region_name="ap-southeast-1") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |         IdempotencyToken="terraform-20221125230308947400000001", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  |     ca = client.describe_certificate_authority(CertificateAuthorityArn=ca_arn)[ | ||
|  |         "CertificateAuthority" | ||
|  |     ] | ||
|  | 
 | ||
|  |     ca.should.have.key("Arn").equals(ca_arn) | ||
|  |     ca.should.have.key("OwnerAccount").equals(DEFAULT_ACCOUNT_ID) | ||
|  |     ca.should.have.key("CreatedAt") | ||
|  |     ca.should.have.key("Type").equals("SUBORDINATE") | ||
|  |     ca.should.have.key("Status").equals("PENDING_CERTIFICATE") | ||
|  |     ca.should.have.key("CertificateAuthorityConfiguration").equals( | ||
|  |         { | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         } | ||
|  |     ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_describe_unknown_certificate_authority(): | ||
|  |     client = boto3.client("acm-pca", region_name="ap-southeast-1") | ||
|  | 
 | ||
|  |     with pytest.raises(ClientError) as exc: | ||
|  |         client.describe_certificate_authority(CertificateAuthorityArn="unknown") | ||
|  |     err = exc.value.response["Error"] | ||
|  |     err["Code"].should.equal("ResourceNotFoundException") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_get_certificate_authority_certificate(): | ||
|  |     client = boto3.client("acm-pca", region_name="ap-southeast-1") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |         IdempotencyToken="terraform-20221125230308947400000001", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     resp = client.get_certificate_authority_certificate(CertificateAuthorityArn=ca_arn) | ||
|  | 
 | ||
|  |     # Certificate is empty for now,  until we call import_certificate_authority_certificate | ||
|  |     resp.should.have.key("Certificate").equals("") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_get_certificate_authority_csr(): | ||
|  |     client = boto3.client("acm-pca", region_name="us-east-2") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |         IdempotencyToken="terraform-20221125230308947400000001", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     resp = client.get_certificate_authority_csr(CertificateAuthorityArn=ca_arn) | ||
|  | 
 | ||
|  |     resp.should.have.key("Csr") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_list_tags_when_ca_has_no_tags(): | ||
|  |     client = boto3.client("acm-pca", region_name="us-east-2") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |         IdempotencyToken="terraform-20221125230308947400000001", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     resp = client.list_tags(CertificateAuthorityArn=ca_arn) | ||
|  |     resp.should.have.key("Tags").equals([]) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_list_tags(): | ||
|  |     client = boto3.client("acm-pca", region_name="us-east-2") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |         IdempotencyToken="terraform-20221125230308947400000001", | ||
|  |         Tags=[{"Key": "t1", "Value": "v1"}, {"Key": "t2", "Value": "v2"}], | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     resp = client.list_tags(CertificateAuthorityArn=ca_arn) | ||
|  |     resp.should.have.key("Tags").equals( | ||
|  |         [{"Key": "t1", "Value": "v1"}, {"Key": "t2", "Value": "v2"}] | ||
|  |     ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_update_certificate_authority(): | ||
|  |     client = boto3.client("acm-pca", region_name="eu-west-1") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     client.update_certificate_authority( | ||
|  |         CertificateAuthorityArn=ca_arn, | ||
|  |         Status="DISABLED", | ||
|  |     ) | ||
|  | 
 | ||
|  |     ca = client.describe_certificate_authority(CertificateAuthorityArn=ca_arn)[ | ||
|  |         "CertificateAuthority" | ||
|  |     ] | ||
|  |     ca.should.have.key("Status").equals("DISABLED") | ||
|  |     ca.should.have.key("LastStateChangeAt") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_delete_certificate_authority(): | ||
|  |     client = boto3.client("acm-pca", region_name="ap-southeast-1") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     client.delete_certificate_authority(CertificateAuthorityArn=ca_arn) | ||
|  | 
 | ||
|  |     ca = client.describe_certificate_authority(CertificateAuthorityArn=ca_arn)[ | ||
|  |         "CertificateAuthority" | ||
|  |     ] | ||
|  |     ca.should.have.key("Status").equals("DELETED") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_issue_certificate(): | ||
|  |     client = boto3.client("acm-pca", region_name="ap-southeast-1") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "t8fzth32.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="ROOT", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     csr = client.get_certificate_authority_csr(CertificateAuthorityArn=ca_arn)["Csr"] | ||
|  | 
 | ||
|  |     resp = client.issue_certificate( | ||
|  |         CertificateAuthorityArn=ca_arn, | ||
|  |         Csr=csr, | ||
|  |         SigningAlgorithm="SHA512WITHRSA", | ||
|  |         Validity={"Type": "YEARS", "Value": 10}, | ||
|  |     ) | ||
|  | 
 | ||
|  |     resp.should.have.key("CertificateArn") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_get_certificate(): | ||
|  |     client = boto3.client("acm-pca", region_name="us-east-2") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "t8fzth32.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="ROOT", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     csr = client.get_certificate_authority_csr(CertificateAuthorityArn=ca_arn)["Csr"] | ||
|  | 
 | ||
|  |     certificate_arn = client.issue_certificate( | ||
|  |         CertificateAuthorityArn=ca_arn, | ||
|  |         Csr=csr, | ||
|  |         SigningAlgorithm="SHA512WITHRSA", | ||
|  |         Validity={"Type": "YEARS", "Value": 10}, | ||
|  |     )["CertificateArn"] | ||
|  | 
 | ||
|  |     resp = client.get_certificate( | ||
|  |         CertificateAuthorityArn=ca_arn, CertificateArn=certificate_arn | ||
|  |     ) | ||
|  |     resp.should.have.key("Certificate") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_import_certificate_authority_certificate(): | ||
|  |     client = boto3.client("acm-pca", region_name="eu-west-1") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     cert = create_cert() | ||
|  | 
 | ||
|  |     client.import_certificate_authority_certificate( | ||
|  |         CertificateAuthorityArn=ca_arn, | ||
|  |         Certificate=cert, | ||
|  |     ) | ||
|  | 
 | ||
|  |     ca = client.describe_certificate_authority(CertificateAuthorityArn=ca_arn)[ | ||
|  |         "CertificateAuthority" | ||
|  |     ] | ||
|  |     ca.should.have.key("Status").equals("ACTIVE") | ||
|  |     ca.should.have.key("NotBefore") | ||
|  |     ca.should.have.key("NotAfter") | ||
|  | 
 | ||
|  |     resp = client.get_certificate_authority_certificate(CertificateAuthorityArn=ca_arn) | ||
|  |     resp.should.have.key("Certificate").match("^-----BEGIN CERTIFICATE-----") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_tag_certificate_authority(): | ||
|  |     client = boto3.client("acm-pca", region_name="eu-west-1") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     client.tag_certificate_authority( | ||
|  |         CertificateAuthorityArn=ca_arn, | ||
|  |         Tags=[{"Key": "t1", "Value": "v1"}, {"Key": "t2", "Value": "v2"}], | ||
|  |     ) | ||
|  | 
 | ||
|  |     resp = client.list_tags(CertificateAuthorityArn=ca_arn) | ||
|  |     resp.should.have.key("Tags").equals( | ||
|  |         [{"Key": "t1", "Value": "v1"}, {"Key": "t2", "Value": "v2"}] | ||
|  |     ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_acmpca | ||
|  | def test_untag_certificate_authority(): | ||
|  |     client = boto3.client("acm-pca", region_name="eu-west-1") | ||
|  |     ca_arn = client.create_certificate_authority( | ||
|  |         CertificateAuthorityConfiguration={ | ||
|  |             "KeyAlgorithm": "RSA_4096", | ||
|  |             "SigningAlgorithm": "SHA512WITHRSA", | ||
|  |             "Subject": {"CommonName": "yscb41lw.test"}, | ||
|  |         }, | ||
|  |         CertificateAuthorityType="SUBORDINATE", | ||
|  |     )["CertificateAuthorityArn"] | ||
|  | 
 | ||
|  |     client.tag_certificate_authority( | ||
|  |         CertificateAuthorityArn=ca_arn, | ||
|  |         Tags=[{"Key": "t1", "Value": "v1"}, {"Key": "t2", "Value": "v2"}], | ||
|  |     ) | ||
|  | 
 | ||
|  |     client.untag_certificate_authority( | ||
|  |         CertificateAuthorityArn=ca_arn, Tags=[{"Key": "t1", "Value": "v1"}] | ||
|  |     ) | ||
|  | 
 | ||
|  |     resp = client.list_tags(CertificateAuthorityArn=ca_arn) | ||
|  |     resp.should.have.key("Tags").equals([{"Key": "t2", "Value": "v2"}]) | ||
|  | 
 | ||
|  | 
 | ||
|  | def create_cert(): | ||
|  |     serial_number = cryptography.x509.random_serial_number() | ||
|  |     subject = cryptography.x509.Name( | ||
|  |         [ | ||
|  |             cryptography.x509.NameAttribute(NameOID.COUNTRY_NAME, "US"), | ||
|  |             cryptography.x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "CA"), | ||
|  |             cryptography.x509.NameAttribute(NameOID.LOCALITY_NAME, "Test Francisco"), | ||
|  |             cryptography.x509.NameAttribute(NameOID.ORGANIZATION_NAME, "TestCompany"), | ||
|  |             cryptography.x509.NameAttribute(NameOID.COMMON_NAME, "testcert.io"), | ||
|  |         ] | ||
|  |     ) | ||
|  |     issuer = cryptography.x509.Name( | ||
|  |         [  # C = US, O = Amazon, OU = Server CA 1B, CN = Amazon | ||
|  |             cryptography.x509.NameAttribute(NameOID.COUNTRY_NAME, "US"), | ||
|  |             cryptography.x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Amazon"), | ||
|  |             cryptography.x509.NameAttribute( | ||
|  |                 NameOID.ORGANIZATIONAL_UNIT_NAME, "Server CA 1B" | ||
|  |             ), | ||
|  |             cryptography.x509.NameAttribute(NameOID.COMMON_NAME, "TestCert"), | ||
|  |         ] | ||
|  |     ) | ||
|  |     key = cryptography.hazmat.primitives.asymmetric.rsa.generate_private_key( | ||
|  |         public_exponent=65537, key_size=2048 | ||
|  |     ) | ||
|  |     cert = ( | ||
|  |         cryptography.x509.CertificateBuilder() | ||
|  |         .subject_name(subject) | ||
|  |         .issuer_name(issuer) | ||
|  |         .public_key(key.public_key()) | ||
|  |         .serial_number(serial_number) | ||
|  |         .not_valid_before(datetime.datetime.utcnow() - datetime.timedelta(days=10)) | ||
|  |         .not_valid_after(datetime.datetime.utcnow() + datetime.timedelta(days=10)) | ||
|  |         .sign(key, hashes.SHA512(), default_backend()) | ||
|  |     ) | ||
|  | 
 | ||
|  |     return cert.public_bytes(serialization.Encoding.PEM) |