Data in Transit on AWS: TLS, ACM, and End-to-End Encryption Design
Data in transit on AWS is any data moving between a client and a service, or between two AWS resources, and protecting it means three things: the unencrypted path is refused rather than merely unused, the path stays private when it should, and traffic between your own resources is encrypted even where your software cannot do it. SCS-C03 Task 5.1 tests all three. You will enforce encrypted connections service by service — S3 bucket policies, Elastic Load Balancing security policies and the condition keys that govern them, CloudFront protocol policies, and database and cache TLS settings — and choose deliberately between edge termination, re-encryption and TLS passthrough, including mutual TLS on API Gateway and ALB. You will design private access with VPC endpoints, AWS PrivateLink, AWS Client VPN and AWS Verified Access. And you will configure inter-resource encryption: Nitro instance encryption, VPC Encryption Controls, and the in-transit settings of Amazon EMR, Amazon EKS and SageMaker AI. Certificate lifecycle management belongs to Task 5.3, at-rest encryption to Task 5.2; this lesson is about the wire.
On this page11 sections
- Enforcing encrypted transport, service by service
- Load balancer TLS: security policies, certificates and governance
- Where TLS terminates: edge, re-encrypt, or passthrough
- Mutual TLS: authenticating the client, not just the server
- Certificates for TLS endpoints: ACM and AWS Private CA in brief
- Private access to services: VPC endpoints and AWS PrivateLink
- Remote user access: AWS Client VPN vs AWS Verified Access
- Encryption AWS applies on the network: Nitro, VPC Encryption Controls, Regions and hybrid paths
- Inter-node encryption for Amazon EMR, Amazon EKS and SageMaker AI
- Scenario: end-to-end TLS for a three-tier application
- Troubleshooting TLS: evidence, SNI and origin trust
- Enforce encrypted connections with aws:SecureTransport bucket policies, CloudFront viewer and origin protocol policies, and server-side database and cache TLS settings
- Choose ELB security policies by name, govern them across accounts with elasticloadbalancing condition keys, and serve RSA and ECDSA certificates with SNI
- Choose between edge termination, re-encryption and TLS passthrough, and enforce mutual TLS on API Gateway and Application Load Balancer
- Design private access to AWS and partner services with gateway endpoints, interface endpoints and PrivateLink endpoint services
- Choose between AWS Client VPN and AWS Verified Access, and configure Client VPN authentication, authorization rules and split tunnel
- Configure inter-resource encryption with Nitro instance encryption, VPC Encryption Controls, and the in-transit settings for Amazon EMR, Amazon EKS and SageMaker AI
- Diagnose TLS failures with ALB access and connection logs, SNI behaviour and certificate trust rules
Enforcing encrypted transport, service by service
Encryption in transit is a control only when the server refuses the unencrypted path. Each service has its own enforcement knob, and a client-side setting such as a connection string never counts, because each client can change it.
Amazon S3
Add a bucket policy statement with effect Deny, principal *, covering S3 actions on the bucket and its objects, with the condition aws:SecureTransport = false. Every HTTP request is rejected whatever the caller's IAM permissions, because an explicit deny always wins. An Allow conditioned on aws:SecureTransport = true is not equivalent: any other statement or identity policy that allows the action still lets plaintext through.
To also require a minimum TLS version, add a second deny on s3:TlsVersion (for example NumericLessThan 1.2). It supplements the aws:SecureTransport deny and never replaces it: a plain HTTP request carries no TLS version, so the s3:TlsVersion key is absent, the numeric condition does not match, and plaintext would stay open if that were the only statement.
The S3 static website endpoint serves HTTP only and requires a publicly readable bucket. To serve a static site over HTTPS end to end from a private bucket, put CloudFront in front of the S3 REST endpoint with origin access control (OAC), redirect viewers to HTTPS, and use a CloudFront Function to rewrite folder paths to their index documents (the behaviour the website endpoint used to provide). A bucket policy that allows reads only when a secret Referer header is present does not make a bucket private: it still grants anonymous reads to anyone who sends that header.
Amazon CloudFront
CloudFront splits the decision into two legs. The viewer protocol policy governs client to edge: Redirect HTTP to HTTPS answers HTTP requests with a 301 to the HTTPS URL, while HTTPS only answers HTTP requests with 403 and no redirect. The origin protocol policy governs edge to origin: HTTPS only forces every origin fetch onto TLS, Match viewer uses whatever the viewer used. The viewer's minimum TLS version is set by the distribution's security policy, and that choice depends on the certificate: with the default *.cloudfront.net certificate the security policy is fixed at TLSv1. Raising it requires an alternate domain name with a custom certificate — in ACM it must be in us-east-1 — served with SNI, which offers the TLSv1.2 policies (dedicated-IP serving exists for legacy clients without SNI and offers the older TLSv1 and SSLv3 policies).
Databases and caches
| Engine | Server-side enforcement | Notes |
|---|---|---|
| RDS for PostgreSQL | rds.force_ssl = 1 in the DB parameter group | Defaults to 1 on PostgreSQL 15 and later, 0 on earlier versions — a group copied from older defaults leaves plaintext open. ssl_min_protocol_version only sets the version floor for sessions that already use TLS; it does not reject plaintext. |
| RDS for SQL Server | rds.force_ssl = 1 | Engine refuses non-TLS connections. |
| RDS for MySQL / MariaDB | require_secure_transport = ON | Server rejects unencrypted client connections. |
| Amazon Redshift | require_ssl = true | Cluster parameter group setting. |
| ElastiCache (Valkey 7.2+, Redis OSS 7+) | Transit encryption mode preferred, then required | Enables TLS in place on the same endpoint: preferred accepts both while clients migrate, required then drops plaintext. AUTH tokens authenticate clients; they do not encrypt anything. |
IAM database authentication requires TLS only for the users who sign in with IAM tokens; password users can still connect in plaintext unless the engine parameter is set. For the strongest posture, pair server-side enforcement with clients that verify the server certificate (for example sslmode=verify-full with the RDS CA bundle), so the client authenticates the endpoint instead of merely encrypting to it.
Load balancer TLS: security policies, certificates and governance
A load balancer's HTTPS or TLS listener negotiates TLS according to its security policy: a predefined, named set of protocol versions and cipher suites. Reading the names is a skill in itself. ELBSecurityPolicy-TLS13-1-2-2021-06 allows TLS 1.3 and TLS 1.2 (a TLS 1.2 minimum); ELBSecurityPolicy-TLS13-1-3-2021-06 allows TLS 1.3 only. Variants add FIPS-validated or post-quantum cipher suites, and older names such as ELBSecurityPolicy-2016-08 still accept TLS 1.0 and 1.1. Pair the HTTPS listener with an HTTP:80 listener whose default action redirects to HTTPS:443, so old http:// links reach the secure site instead of failing.
Defaults and governance
The default depends on how the listener is created. The console proposes a recommended TLS 1.3 policy, but a listener created through the AWS CLI, API or CloudFormation without an SslPolicy gets ELBSecurityPolicy-2016-08, which accepts TLS 1.0. Infrastructure-as-code templates that omit the property therefore deploy weak listeners silently.
To prevent that across an organization, use the ELB condition keys in a service control policy (or IAM policies): elasticloadbalancing:SecurityPolicy is evaluated on CreateListener and ModifyListener, so a Deny unless the value is in an approved list refuses weak policies — including the one a listener would inherit by default. elasticloadbalancing:ListenerProtocol controls which listener protocols may be created (for example, only HTTPS and TLS); on its own it forces encryption but says nothing about TLS versions. An SCP covers every principal in the member accounts; a permissions boundary covers only the role it is attached to; AWS Config detects weak listeners after they exist but does not stop their creation.
Certificates, SNI and key algorithms
A listener can hold several certificates. The load balancer chooses one per connection from the Server Name Indication (SNI) hostname in the client's ClientHello; a client that sends no SNI receives the listener's default certificate. Each ACM certificate has a single key algorithm — RSA or ECDSA — so serving ECDSA to modern clients while older clients keep RSA means adding two certificates for the same hostname. When several certificates match the hostname, the ALB's smart certificate selection picks the best one the client supports.
Where TLS terminates: edge, re-encrypt, or passthrough
Deciding where TLS terminates is the core trade-off of this task. Termination at a load balancer or edge buys Layer 7 features — path routing, AWS WAF inspection, header manipulation — at the price of decryption on an AWS-managed component. True end-to-end encryption means one unbroken TLS session from client to target, which gives those features up.
| Pattern | Where TLS terminates | End to end? | Trade-off |
|---|---|---|---|
| ALB HTTPS listener + HTTPS target group | At the ALB, then re-encrypted to targets | No — two sessions, hop-by-hop encryption | Keeps L7 routing and WAF; ALB handles plaintext |
| NLB TCP listener (passthrough) | On the target only | Yes — a single unbroken session | No L7 features; certificates and keys live on targets |
| NLB TLS listener + TLS target group | At the NLB, then re-encrypted to targets | No — the NLB decrypts | ACM certificate stays on the NLB; works for any TCP protocol |
| CloudFront + HTTPS-only origin | At the edge, then re-encrypted to origin | No — two sessions | Keeps caching and edge WAF; origin certificate is validated |
An ALB always terminates TLS — it is a Layer 7 proxy. An HTTPS target group makes it open a second TLS session to each target, and the ALB does not validate the target's certificate, so self-signed or private-CA certificates on instances work: the hop is encrypted but the target is not authenticated. An NLB behaves according to its listener type, not its load balancer type. A TCP listener forwards bytes untouched — the client's handshake, SNI included, reaches the target, which holds the key. A TLS listener terminates with an ACM certificate; pointing it at a TLS target group re-encrypts to the targets, again without validating their certificates. This is the way to keep a public certificate's private key in ACM while still encrypting the hop for a non-HTTP protocol.
CloudFront always terminates the viewer session at the edge. With an HTTPS-only origin protocol policy it re-encrypts to the origin and — unlike a load balancer — it validates the origin certificate: it must be issued by a publicly trusted CA and cover the origin domain name. A self-signed or private-CA certificate on a custom origin causes 502 errors even though the same backend works behind an ALB.
Mutual TLS: authenticating the client, not just the server
Standard (one-way) TLS authenticates only the server to the client; anyone can open a session. Mutual TLS (mTLS) also requires the client to present a certificate that chains to a CA the server trusts, turning transport encryption into caller authentication. When a requirement says a service must authenticate its callers cryptographically, one-way TLS — an NLB TLS listener, an HTTPS endpoint — is not enough on its own.
API Gateway
Mutual TLS is configured on a custom domain name, with a truststore (a PEM bundle of trusted CA certificates, typically your private CA chain) stored in S3. Clients without a certificate that chains to it are rejected during the handshake. The control applies to the custom domain only: the default execute-api endpoint does not ask for a client certificate, so it remains a bypass until you disable the default endpoint. API Gateway does not check CRLs or OCSP itself; revoke access by updating the truststore or by checking certificate details in a Lambda authorizer.
Application Load Balancer
ALB mutual TLS has two modes. In verify mode the ALB validates the client certificate against a trust store (CA bundle from S3) during the handshake and rejects failures; it then passes details such as X-Amzn-Mtls-Clientcert-Subject and X-Amzn-Mtls-Clientcert-Serial-Number to targets in headers. A trust store can also hold certificate revocation lists imported from S3 — the ALB does not fetch CRLs from the CA by itself — so revoking one certificate means revoking it at the CA, exporting a CRL that lists it, and adding that CRL to the trust store. In passthrough mode the ALB does no validation and forwards the whole client certificate chain to targets in the X-Amzn-Mtls-Clientcert header, leaving verification to the application.
Client certificates are usually issued from a private CA (see the next section). Their keys are secrets whose storage and rotation belong to Task 5.3.
Certificates for TLS endpoints: ACM and AWS Private CA in brief
Every TLS endpoint in this lesson needs a certificate, and two questions decide where it comes from: who must trust it and where the private key may live. Public ACM certificates are free, trusted by browsers, and attach only to integrated services — Elastic Load Balancing, CloudFront (certificate in us-east-1), API Gateway — because their private key never leaves ACM. ACM renews certificates it issued while they are in use and still validate (DNS validation records left in place); imported certificates are never renewed by ACM. AWS Private CA issues certificates trusted only by clients you configure, which suits internal services, mTLS client certificates and machine identities — but CloudFront and public browsers will not accept them.
Issuance, validation, renewal, import and export, exportable certificates and Private CA hierarchy design are certificate management, which SCS-C03 places in Task 5.3 (Skill 5.3.5) — they are covered in depth in the lesson on protecting secrets, keys and confidential data.
Private access to services: VPC endpoints and AWS PrivateLink
Private access means a workload reaches a service without crossing the internet and without an internet gateway or NAT gateway in the path. AWS offers three building blocks, chosen by what you are reaching and from where.
| Option | How it works | Reachable from | Use it for |
|---|---|---|---|
| Gateway endpoint | Route-table entry (prefix list) to S3 or DynamoDB; no charge | Only resources in the VPC whose route tables reference it — not on-premises networks or peered VPCs | In-VPC access to S3 and DynamoDB |
| Interface endpoint (AWS PrivateLink) | Elastic network interfaces with private IPs in your subnets, protected by security groups | The VPC, plus on-premises over Direct Connect or VPN and peered or transit-connected networks | Most AWS services, and S3 from on-premises |
| PrivateLink endpoint service | Your service behind a Network Load Balancer (or Gateway Load Balancer); consumers create interface endpoints to it | Consumer VPCs in any account you allow | Exposing one service to other accounts or customers |
Private DNS on an interface endpoint makes the service's default hostname (for example the Secrets Manager endpoint) resolve to the endpoint's private addresses inside the VPC, so code and SDKs need no change. On-premises hosts don't see that private hosted zone; they use the endpoint-specific DNS names, or a Route 53 Resolver inbound endpoint that forwards the service name.
A PrivateLink endpoint service is not routing. The provider publishes one service; each consumer reaches it through an endpoint with an IP address from the consumer's own subnet. Because no routes are exchanged between the two networks, their address ranges are irrelevant to each other, the provider network is never reachable beyond that service, and the provider has no path to initiate traffic back into consumer VPCs. Peering and transit gateways, by contrast, join whole networks and need non-overlapping CIDRs, which is why PrivateLink is the usual pattern for sharing a service with many accounts. The provider controls which principals may connect and can require acceptance of each endpoint connection. AWS SDKs and the CLI reach AWS-service interface endpoints over HTTPS by default, so that traffic is TLS-encrypted end to end; the endpoint itself provides privacy, not encryption.
For internet-facing content that should reach a private application, CloudFront VPC origins let a distribution front an internal ALB, NLB or EC2 instance in a private subnet, so the origin needs no public exposure. Endpoint policies and the network-layer controls around endpoints are covered in the network security controls lesson (Task 3.3).
Remote user access: AWS Client VPN vs AWS Verified Access
Remote users reach private resources in two ways: AWS Client VPN gives them a network-level tunnel into the VPC, and AWS Verified Access gives them access to specific applications without a VPN, evaluating every request.
| AWS Client VPN | AWS Verified Access | |
|---|---|---|
| What the user gets | An OpenVPN-based TLS tunnel and routes to network ranges | Access to individual applications; no network-level access to the VPC |
| Client software | A VPN client on the device | None for web applications (a browser); a connectivity client for non-HTTP resources |
| Access decision | At connection time, by authentication plus authorization rules per destination CIDR | On every request, by policies over identity and device-posture claims |
| Identity sources | Mutual certificate authentication, Active Directory (AWS Directory Service), or SAML federation | Trust providers: user identity (IAM Identity Center or an OIDC provider) and device management services |
Client VPN design details
- Authentication. Mutual authentication uses a server certificate and client certificates; an endpoint accepts any client certificate that chains to its trusted client CA. Active Directory and SAML federation authenticate users against a directory or an identity provider (with its MFA).
- Authorization rules grant access to destination CIDRs, either for all users or for a specific group. Group-scoped rules need group information, so they work only with Active Directory or SAML authentication. With mutual authentication alone, the documented pattern is one endpoint per user group — and each endpoint must trust a separate client CA, or members of one group could connect to the other's endpoint. The server certificate can be shared.
- Split tunnel pushes only the endpoint route table's routes to the client, so VPC-bound traffic uses the tunnel and other traffic leaves through the user's local network. Full tunnel (the default) sends all of the user's traffic, including internet-bound traffic, into AWS; split tunnel reduces the traffic leaving AWS and so the data transfer cost (and any NAT gateway processing charges, if internet traffic exits through a NAT gateway).
- The client connect handler is a Lambda function run when a client connects; it can only allow or deny the connection (for example after a posture check). It does not assign routes or authorization.
Verified Access is built from an instance, trust providers, groups of applications with shared policies written in Cedar, and endpoints (for example a load balancer or network interface). Policy design and device-trust details are covered with the other hybrid-access controls in Task 3.3; for this task, the decision is choosing it when users need per-application, VPN-less, per-request checked access.
Encryption AWS applies on the network: Nitro, VPC Encryption Controls, Regions and hybrid paths
Some encryption AWS applies for you, and the design question is whether a given path is covered. Inside AWS, Nitro-based instance types that support in-transit encryption encrypt traffic between themselves in hardware, with no performance impact and nothing to install — but only when both instances are supported types, they are in the same VPC or peered VPCs, and the traffic does not pass through a virtual network device or service such as a load balancer or a transit gateway. Across Regions, AWS states that all data flowing over the AWS global network between Regions is encrypted at the physical layer before it leaves AWS secured facilities, and inter-Region VPC peering and transit gateway inter-Region peering traffic are documented as encrypted.
VPC Encryption Controls
VPC Encryption Controls turns that hardware encryption into something you can evidence and enforce within and across the VPCs in a Region, extending it to services such as ALB, NLB, Fargate and transit gateways.
- Monitor mode reports encryption status and lists the resources that would allow cleartext. Existing VPCs must start in monitor mode; enforce mode can be set directly only on a new VPC at creation.
- Evidence comes from the
encryption-statusfield in VPC Flow Logs (not encrypted, Nitro-encrypted, application-encrypted, or both). The field is not added to existing flow logs — you create new flow logs that include it. - Enforce mode blocks creating or attaching resources that permit unencrypted traffic, such as older instance types. A short fixed list of resource types can be excluded where you own the encryption — internet, NAT and egress-only internet gateways, virtual private gateways, peering to non-enforced VPCs, Lambda in the VPC, VPC Lattice and EFS. Nothing else is excludable.
- Traffic between VPCs through a transit gateway is covered only after you enable encryption support on the transit gateway.
- In an enforce-mode VPC, a Network Load Balancer cannot use a TLS listener to offload TLS; targets must terminate TLS themselves.
Hybrid paths
Traffic that leaves AWS is your responsibility. Site-to-Site VPN is IPsec by definition. Direct Connect is private but not encrypted by default; MACsec (IEEE 802.1AE, Layer 2 encryption at line rate, available on supported dedicated connections at MACsec-capable locations) or an IPsec VPN over the connection encrypts it — the connectivity design belongs to Task 3.3. For file transfer, AWS Transfer Family provides managed SFTP and FTPS endpoints in front of S3 or EFS in place of plain FTP.
Inter-node encryption for Amazon EMR, Amazon EKS and SageMaker AI
Distributed frameworks often talk between nodes in plaintext. Each service has its own setting, and network isolation is never a substitute: private subnets, endpoints and network-isolation flags restrict where traffic can go but do not encrypt it.
Amazon EMR
In-transit encryption is part of an EMR security configuration, which is applied when a cluster is launched — it cannot be added to a running cluster, so an existing cluster is replaced. It enables TLS for inter-node and application traffic (for example Hadoop, Spark and Presto/Trino services). The certificates come from one of three providers:
- PEM files: a zip in S3 with fixed file names (
privateKey.pem,certificateChain.pem, and optionallytrustedCertificates.pem). Private keys must have no passphrase, because services start unattended; a passphrase-protected key makes clusters fail to start. Use a wildcard common name for the cluster's internal domain (for example*.ec2.internal) so one certificate covers every node. - Custom provider: your Java class implementing
TLSArtifactsProvider, stored in S3, which supplies the artifacts at launch. - EMR-managed certificates (release 7.11.0 and later): EMR creates the certificates, so you do not package or store any. EMR does not rotate them; they carry a long default validity, and when the CA expires you re-create the security configuration and launch clusters with it.
Amazon EKS
With the Amazon VPC CNI, pods get VPC IP addresses, so traffic between pods on different nodes is instance-to-instance traffic. Running node groups on Nitro instance types that support in-transit encryption encrypts it in hardware, with no sidecars, no application change and no throughput cost (same-VPC and peering conditions apply). That encrypts but does not identify workloads. When a service must authenticate its callers cryptographically, use a service mesh that issues per-workload certificates for mutual TLS, plus an authorization policy. Kubernetes network policies and security groups for pods filter traffic by address or label; neither encrypts it nor authenticates the caller cryptographically. The Kubernetes API endpoint is always reached over TLS.
SageMaker AI
For distributed training and processing, set EnableInterContainerTrafficEncryption to true. It encrypts traffic between the job's ML instances using an IPsec-style tunnel, so the job's security group must allow UDP port 500 and the ESP protocol (IP protocol 50) among its own instances. It has no effect on single-instance jobs, and it can lengthen training time and raise cost in proportion to how much the instances communicate. Private VPC subnets, gateway endpoints and EnableNetworkIsolation keep training traffic private or block outbound calls; only inter-container traffic encryption encrypts the traffic between training instances.
Scenario: end-to-end TLS for a three-tier application
Take a three-tier application — CloudFront in front of an ALB, EC2 targets, RDS for PostgreSQL — with the requirement that data is encrypted on every hop.
Hop 1, client to edge: add an alternate domain name with a public ACM certificate in us-east-1, serve it with SNI, set the viewer protocol policy to redirect HTTP to HTTPS, and choose a TLSv1.2 security policy (the default cloudfront.net certificate would pin the policy at TLSv1).
Hop 2, edge to ALB: set the origin protocol policy to HTTPS only. The ALB needs its own publicly trusted certificate in the ALB's Region that covers the origin domain name, because CloudFront validates it. Give the ALB a recommended TLS 1.3 security policy, and if the ALB should not be internet-facing, use a CloudFront VPC origin.
Hop 3, ALB to instances: use an HTTPS target group. Instances can present private-CA or even self-signed certificates, since the ALB does not validate target certificates.
Hop 4, application to database: set rds.force_ssl to 1 in the parameter group (explicitly, on versions before 15) so the engine refuses plaintext, and configure the driver to verify the server certificate.
Now change one requirement: TLS must not be decrypted anywhere between client and instance. CloudFront and the ALB both terminate, so the design becomes an NLB with a TCP listener passing 443 straight to instances that hold the certificates — giving up WAF and path routing for a single unbroken session. Change the constraint and the answer changes: if the rule is about who holds the certificate's private key rather than about decryption, a load balancer may decrypt, and the termination options in the table above are compared on that axis. Two questions settle every variant: may any hop between client and workload see plaintext, and must the private key stay inside ACM?
Troubleshooting TLS: evidence, SNI and origin trust
TLS troubleshooting starts from evidence, and each source answers a different question.
| Source | What it shows | What it can't show |
|---|---|---|
| ALB access logs | Per request: client IP, negotiated ssl_protocol and ssl_cipher | Clients whose handshake failed (no request was made) |
| ALB connection logs | Per TLS connection: client IP, protocol, cipher, handshake latency, and failure reason for failed handshakes | HTTP request details |
ClientTLSNegotiationErrorCount metric | How many handshakes failed | Which clients failed |
Raising a minimum TLS version: legacy clients — old Java runtimes, embedded devices — fail below the HTTP layer and see connection resets, not error pages. Query access logs (for example with Athena on ssl_protocol) before the change to list the clients still using TLS 1.0 or 1.1; after a change, connection logs identify the clients whose handshakes now fail. CloudFront standard logs report viewer TLS versions the same way.
Name mismatch for some clients only: clients that send no SNI receive the listener's default certificate, so a probe or old library calling a non-default hostname gets the wrong certificate while browsers work.
502 from CloudFront after switching the origin to HTTPS: the origin certificate is self-signed, private-CA issued, expired or does not match the origin domain. Redirect loops appear when the origin protocol policy is HTTP only while the origin redirects HTTP to HTTPS; align the two. Mixed content (an HTTPS page loading HTTP resources) is fixed in the page, not the TLS configuration.
Expired certificate on an ACM-backed endpoint: the usual causes are a removed DNS validation record or an imported certificate, which ACM never renews; monitoring and renewal design are covered with certificate management in Task 5.3.
Tip. Expect requirement-driven stems. A rule that the server must refuse plaintext points to a server-side setting (bucket-policy deny, engine parameter, transit encryption mode), never a client connection string. Termination questions turn on two requirements: whether any intermediate hop may decrypt, and where the certificate's private key is allowed to live. Organization-wide TLS minimums point to SCP condition keys on listeners. Private-access stems turn on where the caller sits (in the VPC, on-premises, another account) and whether users need a network or an application. Inter-node stems turn on what each control does: Nitro and VPC Encryption Controls encrypt and evidence, mesh mTLS authenticates, network isolation only restricts.
- Enforcement is server-side: a Deny on aws:SecureTransport = false for S3 (with any s3:TlsVersion deny added alongside, never instead), CloudFront viewer and origin protocol policies, rds.force_ssl or require_secure_transport, and ElastiCache transit encryption mode required.
- ELB security policy names encode the versions (TLS13-1-2 = TLS 1.2 minimum, TLS13-1-3 = TLS 1.3 only); listeners created by CLI or CloudFormation without SslPolicy get ELBSecurityPolicy-2016-08, so govern them with an SCP on elasticloadbalancing:SecurityPolicy.
- An ALB always terminates TLS, re-encrypts only when the target group uses HTTPS, and never validates target certificates; an NLB TCP listener passes TLS through end to end, while an NLB TLS listener terminates; CloudFront validates origin certificates and needs a publicly trusted one.
- API Gateway mTLS protects only the custom domain — disable the default execute-api endpoint; ALB mTLS verify mode checks a trust store and imported CRLs, passthrough mode leaves validation to the application.
- Gateway endpoints serve S3 and DynamoDB inside one VPC only; interface endpoints (PrivateLink) work from on-premises too, and PrivateLink endpoint services share one service without routing or CIDR conflicts.
- Client VPN gives a network tunnel with authorization rules per CIDR (group rules need AD or SAML); Verified Access gives VPN-less, per-request identity- and device-checked access to individual applications.
- Nitro instances encrypt traffic between supported types in the same or peered VPCs (not through load balancers or transit gateways); VPC Encryption Controls evidences it with the flow-log encryption-status field and enforces it after starting in monitor mode.
- EMR in-transit encryption comes from a security configuration applied at launch; EKS pod traffic is encrypted by Nitro nodes but authenticated only by mesh mTLS; SageMaker AI inter-container encryption needs UDP 500 and ESP and slows distributed training.
Frequently asked questions
How do I force HTTPS-only access to an S3 bucket?
Attach a bucket policy statement with effect Deny for all principals on S3 actions, conditioned on aws:SecureTransport being false. Because an explicit deny overrides any allow, every HTTP request is rejected whatever IAM permissions the caller has. To also require TLS 1.2 or later, add a second deny on s3:TlsVersion; it cannot replace the first, because plain HTTP requests carry no TLS version and would not match it.
What is the difference between ALB TLS termination and NLB TLS passthrough?
An ALB is a Layer 7 proxy, so it always terminates the client's TLS session; with an HTTPS target group it opens a second session to the targets without validating their certificates, which gives hop-by-hop encryption plus features such as AWS WAF and path routing. An NLB with a TCP listener forwards the encrypted bytes untouched, so one session runs from client to target, which holds the certificate. An NLB with a TLS listener terminates TLS, so the listener type decides.
How does API Gateway mutual TLS work?
You enable mutual TLS on an API Gateway custom domain name and point it at a truststore, a PEM bundle of trusted CA certificates stored in S3. Clients must present a certificate that chains to the truststore or the handshake fails. The default execute-api endpoint does not enforce mTLS, so you must disable it, or callers can bypass the control by using it.
Is traffic between EC2 instances encrypted automatically?
Yes, when both instances are Nitro instance types that support in-transit encryption and they are in the same VPC or in peered VPCs, and the traffic does not pass through a load balancer, transit gateway or similar network service. The encryption happens in hardware with no performance impact. VPC Encryption Controls lets you prove it with the encryption-status flow-log field and, in enforce mode, block resources that would allow cleartext.
What is the difference between a gateway endpoint and an interface endpoint?
A gateway endpoint is a free route-table entry that gives resources inside one VPC private access to Amazon S3 or DynamoDB; on-premises networks and peered VPCs cannot use it. An interface endpoint, powered by AWS PrivateLink, places network interfaces with private IP addresses in your subnets for most AWS services, including S3, so it can be reached from on-premises over Direct Connect or VPN. With private DNS, the default service hostname resolves to it inside the VPC.
Should I use AWS Client VPN or AWS Verified Access?
Use AWS Client VPN when remote users need network-level access to ranges in a VPC through a VPN client, with authorization rules per destination CIDR. Use AWS Verified Access when users should reach specific applications without a VPN and without network access, with every request evaluated against identity and device-posture claims from trust providers. Verified Access is the zero-trust, per-application choice; Client VPN is the network tunnel.
How do I encrypt traffic between nodes of an Amazon EMR cluster?
Create an EMR security configuration with in-transit encryption enabled and launch the cluster with it; it cannot be added to a running cluster. Certificates come from a PEM zip in S3 with fixed file names and passphrase-free keys, from a custom TLSArtifactsProvider class, or, from release 7.11.0, from EMR itself. EMR does not rotate EMR-managed certificates; when their CA expires, you re-create the security configuration.
Is AWS Direct Connect encrypted by default?
No. Direct Connect is a private, dedicated circuit, but traffic crosses it unencrypted by default. To encrypt the path, use MACsec on supported dedicated connections, or run an IPsec Site-to-Site VPN over the Direct Connect connection. TLS at the application layer protects the data in either design.
Source
This lesson covers the "Data Protection" domain of the official SCS-C03 exam guide. Vendors revise their guides — check the source for the current version.
- AWS Certified Security – Specialty (SCS-C03) exam guide — Amazon Web Services
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.