SAA-C03Chapter 45 of 189Objective 1.2

S3 Encryption: SSE-S3, SSE-KMS, SSE-C, Client-Side

This chapter covers the four encryption methods available for Amazon S3: SSE-S3, SSE-KMS, SSE-C, and client-side encryption. Understanding these options is critical for the SAA-C03 exam, as encryption-related questions appear in roughly 10-15% of the exam questions, often as part of secure architecture scenarios. You will learn the internal mechanisms, key differences, and exam traps for each method, enabling you to select the correct encryption approach for any given requirement.

25 min read
Intermediate
Updated May 31, 2026

S3 Encryption: The Safety Deposit Box System

Imagine a bank safety deposit box system. You can store valuables in boxes, but you need to decide who holds the keys. SSE-S3 is like the bank holding a master key for every box: you hand your item to the teller, they lock it with the bank's key, and you rely on the bank to never misuse it. SSE-KMS is like the bank using a specialized key management service: you request a key from a central vault, the vault gives you a unique key for your box, and the vault logs every time a key is used. SSE-C is like bringing your own padlock: you supply the key, the bank uses it to lock the box, then immediately discards the key—only you retain it. Client-side encryption is like encrypting your item in a locked briefcase before even entering the bank: the bank never sees the contents or the key. Each method offers a different trade-off between convenience, control, and compliance. For the SAA-C03 exam, understanding these four encryption options is critical because questions often test your ability to choose the right one based on requirements like key control, auditability, and performance.

How It Actually Works

1. Introduction to S3 Encryption

Amazon S3 provides multiple options to encrypt data at rest. Encryption can be applied at the server side (where AWS encrypts the object after receiving it) or at the client side (where you encrypt the data before uploading). The choice of encryption method affects key management, performance, auditability, and compliance. The SAA-C03 exam expects you to understand when to use each option based on specific requirements.

2. SSE-S3: Server-Side Encryption with S3-Managed Keys

SSE-S3 is the simplest encryption method. When you upload an object and request SSE-S3, Amazon S3 encrypts the object using a unique key (object key) and then encrypts that key with a master key that AWS manages and rotates regularly. The encryption algorithm is AES-256 (Advanced Encryption Standard with 256-bit keys). This method requires no additional setup or key management on your part. You simply specify the x-amz-server-side-encryption header with value AES256 in your PUT request.

How it works internally: - When you upload an object, S3 generates a random object key (plaintext). - S3 encrypts the object using AES-256 with that object key. - S3 then encrypts the object key with an AWS-managed master key. - The encrypted object key is stored alongside the encrypted object in the same region. - When you download the object, S3 decrypts the object key using the master key, then uses the decrypted object key to decrypt the object. - The entire process is transparent to the user.

Key characteristics: - No additional cost for key management. - AWS handles key rotation (currently every 3 years). - You cannot control or view the master key. - No audit trail of key usage. - Suitable for environments where compliance requires encryption but key control is not needed.

Configuration: To enable SSE-S3 on a bucket by default, set the default encryption configuration to SSE-S3. Alternatively, specify the header per request:

aws s3 cp myfile.txt s3://mybucket/ --sse AES256

Or using the REST API:

PUT /mybucket/myfile.txt HTTP/1.1
x-amz-server-side-encryption: AES256

3. SSE-KMS: Server-Side Encryption with AWS KMS-Managed Keys

SSE-KMS uses AWS Key Management Service (KMS) to manage encryption keys. This provides more control, including separate permissions for key usage and an audit trail of when keys are used. You can use a customer managed key (CMK) or an AWS managed key. The encryption algorithm is AES-256.

How it works internally: - When you upload an object, you specify the KMS key ID (or alias) via the x-amz-server-side-encryption-aws-kms-key-id header. The header x-amz-server-side-encryption is set to aws:kms. - S3 calls KMS to generate a data key (plaintext and ciphertext versions). - S3 uses the plaintext data key to encrypt the object. - S3 then discards the plaintext data key and stores the encrypted data key (ciphertext) with the object. - When you download, S3 calls KMS to decrypt the data key, then uses the plaintext data key to decrypt the object. - KMS logs every call to AWS CloudTrail, providing an audit trail.

Key characteristics: - You can create and manage your own CMKs, including rotation (automatic yearly or manual). - You can define key policies and IAM policies to control access to the key. - You can disable, delete, or rotate keys. - There is a cost per KMS API call (currently $0.03 per 10,000 requests). - KMS has a request rate limit (default 5,500 requests per second per region, adjustable). - Envelope encryption is used: a data key encrypts the object, and a master key encrypts the data key.

Important exam point: SSE-KMS is subject to KMS request throttling. If you have high PUT/GET rates, you may encounter KMS.ThrottlingException. This is a common exam trap.

Configuration: To set default encryption with SSE-KMS:

aws s3api put-bucket-encryption --bucket mybucket --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"alias/mykey"}}]}'

Per request:

aws s3 cp myfile.txt s3://mybucket/ --sse aws:kms --sse-kms-key-id alias/mykey

4. SSE-C: Server-Side Encryption with Customer-Provided Keys

SSE-C allows you to provide your own encryption key. AWS uses that key to encrypt the object, but AWS does not store the key. You must manage and remember the key; if you lose it, you cannot decrypt the object.

How it works internally: - When you upload, you provide the encryption key in the request headers (x-amz-server-side-encryption-customer-key). - S3 uses that key to encrypt the object (AES-256). - S3 stores the object and a hash of the key (not the key itself). - When you download, you must provide the same key. S3 verifies the hash and uses the key to decrypt. - AWS does not store the key; it only stores a salted hash for integrity.

Key characteristics: - You have full control over the key. - No AWS key management cost. - You must use HTTPS (SSL/TLS) because the key is transmitted in the request. - You cannot use the S3 console for SSE-C; you must use CLI, SDK, or REST API. - The key must be 256 bits (32 bytes) and base64-encoded.

Configuration: Using CLI:

aws s3 cp myfile.txt s3://mybucket/ --sse-c --sse-c-key fileb://mykey.bin

REST API headers:

x-amz-server-side-encryption-customer-algorithm: AES256
x-amz-server-side-encryption-customer-key: base64-encoded-key
x-amz-server-side-encryption-customer-key-MD5: base64-encoded-MD5-of-key

5. Client-Side Encryption

Client-side encryption means you encrypt the data before uploading to S3. AWS never sees the unencrypted data. You manage the keys entirely. The AWS SDK supports client-side encryption with the Amazon S3 Encryption Client, which can use a KMS-managed key or a custom key (e.g., a master key stored locally).

How it works internally (using S3 Encryption Client): - The client generates a random symmetric data key (content key). - The client encrypts the object with the data key using AES-256. - The client encrypts the data key with a master key (either KMS or a local key). - The client uploads the encrypted object and the encrypted data key (stored as metadata). - The client can optionally store the encrypted data key in the object metadata. - When downloading, the client decrypts the data key using the master key, then decrypts the object.

Key characteristics: - Full control: AWS never sees the plaintext data or the keys. - You must manage the master key securely. - The encryption process happens in your application, which may impact performance. - The S3 Encryption Client can use either KMS or a custom key store. - The encryption is transparent to S3; S3 only stores the encrypted blob.

Configuration: Using AWS SDK for Java with KMS:

KMSEncryptionMaterialsProvider materialsProvider = new KMSEncryptionMaterialsProvider(kmsKeyId);
AmazonS3EncryptionClient encryptionClient = AmazonS3EncryptionClientBuilder.standard()
    .withEncryptionMaterials(materialsProvider)
    .withRegion(Regions.US_EAST_1)
    .build();
encryptionClient.putObject("mybucket", "myfile.txt", new File("myfile.txt"));

6. Comparison and Interaction with Other Services

S3 Inventory and S3 Select: SSE-S3 and SSE-KMS objects are supported; SSE-C objects are not supported by S3 Select.

S3 Batch Operations: Support SSE-S3 and SSE-KMS; SSE-C requires special handling.

Cross-Region Replication (CRR): If source objects are encrypted with SSE-KMS, you must specify a KMS key in the destination region. SSE-S3 objects are replicated without additional configuration. SSE-C objects cannot be replicated by default (you must use a Lambda function).

S3 Event Notifications: Work with all encryption methods.

S3 Object Lambda: Can transform data before encryption or after decryption.

7. Performance Considerations

SSE-S3 and SSE-KMS add minimal overhead; encryption happens at the server side.

SSE-KMS introduces latency due to KMS API calls. High request rates may hit KMS throttling limits.

SSE-C requires you to send the key with each request, increasing request size and requiring HTTPS.

Client-side encryption adds CPU overhead on the client side; you must manage key material and handle errors.

8. Security and Compliance

SSE-S3: Meets compliance requirements that mandate encryption at rest but do not require key control.

SSE-KMS: Provides auditability, key rotation, and fine-grained access control. Required for compliance frameworks like PCI DSS that need key management.

SSE-C: Used when you must retain control of keys and cannot trust AWS with key management.

Client-Side: Used when you need end-to-end encryption and AWS should never see plaintext.

9. Exam Tips

If the question mentions "you want to control key rotation" or "audit key usage," choose SSE-KMS.

If the question says "you want to encrypt but don't want to manage keys," choose SSE-S3.

If the question says "you must provide your own key and AWS cannot store it," choose SSE-C.

If the question says "you must encrypt data before sending to AWS," choose client-side encryption.

Be aware of KMS throttling: if high PUT/GET rates are expected, SSE-KMS may not be suitable.

SSE-C cannot be used with S3 console; you must use CLI/SDK.

Client-side encryption with KMS still uses KMS for key management, but the encryption happens client-side.

Walk-Through

1

Upload Object with SSE-S3

1. Client sends PUT request with `x-amz-server-side-encryption: AES256`. 2. S3 generates a random object key (256-bit). 3. S3 encrypts the object using AES-256 with the object key. 4. S3 encrypts the object key with an AWS-managed master key. 5. S3 stores the encrypted object and encrypted object key. 6. S3 returns HTTP 200 with ETag. The client never sees the keys.

2

Download Object with SSE-S3

1. Client sends GET request. 2. S3 retrieves the encrypted object and encrypted object key. 3. S3 decrypts the object key using the AWS-managed master key. 4. S3 decrypts the object using the decrypted object key. 5. S3 returns the plaintext object. The process is transparent.

3

Upload Object with SSE-KMS

1. Client sends PUT request with `x-amz-server-side-encryption: aws:kms` and optionally `x-amz-server-side-encryption-aws-kms-key-id`. 2. S3 calls KMS GenerateDataKey to get a plaintext and ciphertext data key. 3. S3 encrypts the object with the plaintext data key. 4. S3 discards the plaintext data key. 5. S3 stores the encrypted object and ciphertext data key. 6. KMS logs the call to CloudTrail.

4

Download Object with SSE-KMS

1. Client sends GET request. 2. S3 calls KMS Decrypt with the ciphertext data key. 3. KMS returns the plaintext data key. 4. S3 decrypts the object with the plaintext data key. 5. S3 returns the plaintext object. 6. KMS logs the decrypt call.

5

Upload Object with SSE-C

1. Client generates a 256-bit key and base64-encodes it. 2. Client sends PUT request with headers: `x-amz-server-side-encryption-customer-algorithm: AES256`, `x-amz-server-side-encryption-customer-key: <base64-key>`, and `x-amz-server-side-encryption-customer-key-MD5: <base64-MD5>`. 3. S3 computes the MD5 of the key and compares it to the provided MD5. 4. S3 uses the key to encrypt the object with AES-256. 5. S3 stores the encrypted object and a salted hash of the key. 6. S3 discards the key. Client must retain the key.

6

Download Object with SSE-C

1. Client sends GET request with the same encryption headers (algorithm, key, MD5). 2. S3 retrieves the encrypted object and the stored hash. 3. S3 verifies the key hash matches. 4. S3 uses the provided key to decrypt the object. 5. S3 returns the plaintext object. If the key is incorrect, S3 returns a 400 error.

What This Looks Like on the Job

Enterprise Scenario 1: Healthcare Data Compliance

A healthcare company stores protected health information (PHI) in S3. They must comply with HIPAA, which requires encryption at rest and key management controls. They choose SSE-KMS with a customer managed key (CMK) that is rotated annually. They set IAM policies to restrict key usage to specific IAM roles. They enable CloudTrail to audit every KMS API call. This setup meets compliance requirements and provides auditability. The team configures default bucket encryption to SSE-KMS with the CMK alias. They also set up S3 bucket policies to deny uploads without encryption headers. A common issue is KMS throttling during peak hours; they request a KMS quota increase to handle 10,000 requests per second.

Enterprise Scenario 2: Financial Services with Customer-Provided Keys

A financial institution must retain full control over encryption keys due to regulatory requirements. They use SSE-C for sensitive transaction logs. They generate a unique key per object and store keys in a secure on-premises HSM. Each upload includes the key in the request headers over HTTPS. They cannot use the S3 console; all operations are via the CLI and SDK. A misconfiguration occurs when a developer forgets to include the key in a download request, resulting in a 400 error. They implement a key management script that retrieves keys from the HSM and attaches them to requests. Performance is acceptable because the keys are used only during upload/download.

Enterprise Scenario 3: Media Company with Client-Side Encryption

A media company needs to ensure that even AWS cannot access raw footage uploaded to S3. They implement client-side encryption using the AWS SDK with a KMS master key. The client application encrypts each video file using a unique data key, then encrypts the data key with a KMS CMK. The encrypted data key is stored as object metadata. This ensures end-to-end encryption. They face performance overhead because encryption is CPU-intensive; they use compute-optimized EC2 instances for the upload process. A common mistake is losing the KMS key; they enable automatic key rotation and store a backup in a different region. They also implement a decryption proxy for downstream processing.

How SAA-C03 Actually Tests This

The SAA-C03 exam tests S3 encryption under Domain 1: Secure Architectures, Objective 1.2: Define an encryption strategy for data at rest. You will encounter scenario-based questions asking you to choose the appropriate encryption method based on requirements.

Common Wrong Answers: 1. Choosing SSE-S3 when the question requires key control or auditability. Candidates assume SSE-S3 is always sufficient because it's simple. The trap: SSE-S3 does not provide key management or audit trails. If the question mentions 'you need to control key rotation' or 'audit key usage,' SSE-S3 is wrong. 2. Choosing SSE-C when the question says 'you want AWS to manage the keys.' Candidates confuse SSE-C with SSE-S3. SSE-C requires you to provide and manage keys. If the question says 'AWS manages keys,' SSE-C is wrong. 3. Choosing client-side encryption when the requirement is server-side encryption. The exam sometimes explicitly states 'server-side encryption.' Client-side is not server-side. Many candidates pick client-side for control, but the question specifies server-side. 4. Overlooking KMS throttling with SSE-KMS. When a scenario involves high throughput (e.g., thousands of uploads per second), SSE-KMS may cause throttling. Candidates often choose SSE-KMS for its features but forget the performance impact.

Specific Terms and Numbers: - AES256 is the algorithm for SSE-S3 and SSE-C. - x-amz-server-side-encryption header values: AES256 (SSE-S3), aws:kms (SSE-KMS). - SSE-C requires three headers: algorithm, key, and key-MD5. - KMS key ID can be an ARN, alias, or key ID. - SSE-C key must be 256 bits.

Edge Cases: - SSE-C cannot be used with S3 Batch Operations or S3 Select. - SSE-KMS objects copied across regions require a KMS key in the destination region. - Default bucket encryption does not apply to pre-existing objects; only new uploads. - If you use SSE-KMS with an AWS managed key, you cannot view the key in KMS console.

How to Eliminate Wrong Answers: - If the question mentions 'audit' or 'key rotation,' eliminate SSE-S3 and SSE-C. - If the question says 'AWS does not have access to the key,' eliminate SSE-S3, SSE-KMS, and SSE-C (because server-side encryption gives AWS access). Choose client-side. - If the question says 'you must provide the key with each request,' eliminate SSE-S3 and SSE-KMS. Choose SSE-C. - If the question mentions 'high request rates,' eliminate SSE-KMS unless a KMS quota increase is mentioned.

Key Takeaways

SSE-S3 uses AES-256 with AWS-managed keys; no additional cost, no audit trail.

SSE-KMS uses envelope encryption; provides audit trail and key control; subject to KMS throttling.

SSE-C requires you to provide a 256-bit key with each request; AWS does not store the key.

Client-side encryption encrypts data before upload; AWS never sees plaintext.

Default bucket encryption applies only to new objects.

SSE-C cannot be used with S3 console, S3 Batch Operations, or S3 Select.

SSE-KMS with cross-region replication requires specifying a KMS key in the destination region.

To meet 'key control' or 'audit' requirements, choose SSE-KMS or client-side encryption.

Easy to Mix Up

These come up on the exam all the time. Here's how to tell them apart.

SSE-S3

Keys managed entirely by AWS

No additional cost for key management

No audit trail of key usage

No control over key rotation

Suitable for basic compliance

SSE-KMS

Keys managed by AWS KMS; customer can create CMKs

Cost per KMS API call ($0.03/10k requests)

Audit trail via CloudTrail

Full control over key rotation and policies

Required for frameworks like PCI DSS

SSE-C

Server-side encryption; AWS performs encryption

Key provided with each request; AWS does not store it

Must use HTTPS; key transmitted over network

Cannot use S3 console

Encryption algorithm AES-256

Client-Side Encryption

Encryption performed on client side

AWS never sees plaintext or keys

No key transmission to AWS

Can use any encryption algorithm supported by SDK

Full control; AWS cannot decrypt

Watch Out for These

Mistake

SSE-S3 uses a single master key for all objects.

Correct

SSE-S3 uses a unique object key per object, which is then encrypted with a regularly rotated master key. Each object has its own key.

Mistake

SSE-KMS is always faster than SSE-S3.

Correct

SSE-KMS adds latency due to KMS API calls and can be throttled. SSE-S3 is faster because it uses internal S3 key management without external calls.

Mistake

SSE-C allows AWS to store the key for future use.

Correct

AWS does not store the key; it only stores a salted hash for integrity verification. You must provide the key with each request.

Mistake

Client-side encryption with KMS means AWS manages the encryption process.

Correct

Client-side encryption means encryption happens on the client side. Even if KMS is used for key management, AWS never sees the plaintext data or the data key in plaintext.

Mistake

Default bucket encryption applies to all existing objects.

Correct

Default encryption only applies to new objects uploaded after the setting is enabled. Existing objects remain encrypted with their original method (or unencrypted).

Do You Actually Know This?

Reveal each answer, then mark whether you got it right. Score 60%+ to unlock the next chapter.

Frequently Asked Questions

What is the difference between SSE-S3 and SSE-KMS?

SSE-S3 uses AWS-managed keys with no additional cost and no audit trail. SSE-KMS uses AWS KMS, allowing you to control keys, set rotation, and audit usage via CloudTrail. SSE-KMS incurs costs per API call and may throttle under high load.

Can I use SSE-C with the S3 console?

No. SSE-C requires you to provide the encryption key in request headers, which the S3 console does not support. You must use the AWS CLI, SDK, or REST API.

What happens if I lose the key for SSE-C?

You cannot decrypt the object. AWS does not store the key, only a hash. Without the original key, the data is unrecoverable. Always back up your keys securely.

Does client-side encryption use envelope encryption?

Yes. The AWS S3 Encryption Client generates a data key to encrypt the object, then encrypts the data key with a master key (either from KMS or a local key). The encrypted data key is stored with the object.

Can I change the encryption type of an existing object?

You cannot directly modify encryption in place. You must copy the object to itself or a new location with the new encryption settings. For example, use `aws s3 cp s3://bucket/object s3://bucket/object --sse AES256`.

Which encryption method should I use for high-throughput workloads?

SSE-S3 is best because it has no external API calls. SSE-KMS can throttle at high request rates. SSE-C and client-side encryption add overhead on the client side.

How do I enforce encryption on all objects in a bucket?

Use a bucket policy that denies uploads without the `x-amz-server-side-encryption` header set to `AES256` or `aws:kms`. Combine with default encryption settings.

Terms Worth Knowing

Ready to put this to the test?

You've just covered S3 Encryption: SSE-S3, SSE-KMS, SSE-C, Client-Side — now see how well it sticks with free SAA-C03 practice questions. Full explanations included, no account needed.

Done with this chapter?