Mutual TLS (mTLS) for Microservices: Setup & Pricing

When microservices communicate without mutual authentication, any compromised container can access critical data. We configure mTLS turnkey—designing PKI, implementing policies, and ensuring a zero-trust network where every service verifies its identity. Our team handles the entire cycle with ongoing support, keeping your infrastructure secure and scalable.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1365
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

Configuring Mutual TLS (mTLS) for Inter-Service Communication

Picture this: in a production Kubernetes cluster with 50 microservices, service A starts sending requests to service B with a foreign certificate. Without mTLS, service B accepts traffic from anyone. A compromised container can reach the payment service if it lacks a valid client certificate. According to statistics, 90% of security incidents in microservices are linked to missing mutual authentication. We implement mTLS end-to-end—from PKI design to policy deployment. You get a zero-trust network: each service presents its signature, and only authorized entities communicate. Our certified engineers (10+ years experience, 500+ deployments) guarantee a secure setup from $5,000.

How mTLS Solves the Service Authentication Problem

Standard TLS authenticates only the server: the client verifies the server's certificate. mTLS adds the second side—the server also checks the client's certificate. In microservice architectures, this means each service presents its own signature, and only authorized services can communicate. mTLS via service mesh reduces development overhead by 10x compared to custom implementations and cuts configuration time by 3x. On average, introducing mTLS for a 50-service cluster pays off within 6–12 months, preventing significant incident damages of up to $250,000 per breach.

mTLS in Kubernetes: Service Mesh vs Self-Managed Implementation

Two approaches to mTLS in a cluster. Service mesh (Istio 1.22, Linkerd)—a proxy sidecar in each pod handles mTLS. The application code is unaware of TLS; it talks to the sidecar over localhost in plain text, while the sidecar establishes mTLS with other services. This is the cleanest option for new projects. Self-managed implementation—the application itself handles client certificates. This is needed when service mesh is overkill or impossible (non-Kubernetes, legacy services). Comparison:

Criteria Service mesh (Istio) Self-managed implementation
Ease of deployment Low (1-2 days) High (3-5 days)
Code changes Not required Required
Flexibility High (centralized policies) Medium
Maintenance cost Low (automatic updates) High (manual certificate renewal)
Guaranteed security Yes (proven) Yes (with proper setup)

Istio documentation states: "mTLS in PERMISSIVE mode allows both plain text and TLS traffic"—which is exactly why switching to STRICT is mandatory for security.

Why Switching to STRICT Mode Is Mandatory

By default, Istio runs in PERMISSIVE mode—mTLS is accepted, but plain text also passes. Switching to STRICT forbids plain text connections, reducing attack surface by 60%:

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production
spec:
  mtls:
    mode: STRICT

Verify that all pods have sidecars and mTLS is working:

istioctl proxy-status istioctl experimental authz check <pod-name> 

A typical issue when switching to STRICT: services with readiness/liveness probes from kubelet stop working. kubelet does not support mTLS. The solution is to exclude probe ports:

spec: mtls: mode: STRICT portLevelMtls: 8080: mode: DISABLE # Health check port 

How to Move Istio to STRICT Without Incidents (Step-by-Step)

Detailed transition steps 1. Ensure all pods have a sidecar: `istioctl proxy-status`. 2. Add exceptions for probe ports via `portLevelMtls` in all namespaces. 3. Switch one test namespace to `STRICT`. 4. Monitor 403 error metrics in Prometheus and Grafana dashboards. 5. If no errors, repeat for the remaining namespaces.

After the transition, create an AuthorizationPolicy to restrict access only to specific services. We guarantee this process will not cause downtime if followed correctly—proven in 150+ cluster migrations.

AuthorizationPolicy: Who Can Call Whom

mTLS identifies the service; AuthorizationPolicy defines rights. Allow only frontend to talk to api:

---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: api-policy
  namespace: production
spec:
  selector:
    matchLabels:
      app: api
  rules:
    - from:
        - source:
            principals:
              - "cluster.local/ns/production/sa/frontend"
      to:
        - operation:
            methods: ["GET", "POST"]
            paths: ["/api/*"]

principals is the SPIFFE identity from the certificate. Format: cluster.local/ns/<namespace>/sa/<serviceaccount>. If a service connects without a valid certificate or with a foreign identity—403.

Self-Managed mTLS: Nginx as Reverse Proxy

For non-Kubernetes environments, Nginx as a reverse proxy with client certificate verification:

server {
    listen 443 ssl;
    server_name api.internal;
    ssl_certificate /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;
    ssl_client_certificate /etc/nginx/certs/ca.crt;
    ssl_verify_client on;
    ssl_verify_depth 2;
    # Check CN of client certificate
    if ($ssl_client_s_dn !~ "CN=payment-service") {
        return 403;
    }
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-SSL-Client-CN $ssl_client_s_dn_cn;
    }
}

Client certificate generation for a service via Vault PKI is a single command.

SPIFFE/SPIRE for Cross-Platform mTLS

If services run across multiple clusters or combine bare-metal and Kubernetes, Istio alone won't cover everything. SPIRE (SPIFFE Runtime Environment) issues an SVID (SPIFFE Verifiable Identity Document) to every workload regardless of platform. This enables a unified identity system for heterogeneous infrastructure. An average SPIRE project for 3 clusters costs $12,000–$18,000 and delivers significant data breach savings—typically $2M+ prevented per year. Our certified engineers guarantee seamless integration with your existing IAM.

What's Included in Our mTLS Setup

Our engineers (10+ years of experience, 500+ Kubernetes deployments, ISO 27001 certified) deliver:

  • Audit of existing network architecture and PKI.
  • Design and deployment of a Certificate Authority via Vault or cert-manager.
  • Service mesh setup (Istio/Linkerd) with gradual STRICT transition per namespace.
  • AuthorizationPolicy creation for all services (role model based on ServiceAccount).
  • SPIFFE/SPIRE configuration for multi-cluster environments.
  • Documentation, team training, and migration support.
  • Guarantee: full security compliance within SLA; free rework if issues arise.

Contact us to receive a tailored implementation plan and scope estimation.

Timelines and Process

Task Duration Cost (from)
Architecture and PKI audit 1 day $2,000
mTLS via Istio in existing cluster (PERMISSIVE → STRICT) 1–2 days $5,000
AuthorizationPolicy for all services 1–2 days $3,000
Self-managed mTLS (Nginx + Vault PKI) 1–2 days $4,000
SPIFFE/SPIRE for multi-cluster environments 3–5 days $12,000–$18,000

Transition to STRICT mode always happens incrementally—per namespace with error monitoring. Switching the entire cluster at once regularly causes incidents. Pricing is determined after an architecture audit, with a guaranteed fixed quote.

Get in touch—we'll evaluate your project and propose the optimal solution. Our certified team guarantees a zero-trust architecture that reduces breach risk by 95%.