Skip to content

TLS and mTLS v3.8.1 ​

GripMock supports native TLS for gRPC and optional mTLS (client certificate authentication).

How TLS is enabled ​

gRPC TLS is enabled only when both variables are set:

  • GRPC_TLS_CERT_FILE
  • GRPC_TLS_KEY_FILE

If one of them is missing, gRPC starts without TLS.

gRPC TLS environment variables ​

VariablePurposeRequired
GRPC_TLS_CERT_FILEServer certificate file (PEM)Yes, for TLS
GRPC_TLS_KEY_FILEServer private key file (PEM)Yes, for TLS
GRPC_TLS_CLIENT_AUTHEnable mTLS (true/false)No (default: false)
GRPC_TLS_CA_FILECA bundle used to verify client certificatesRequired when GRPC_TLS_CLIENT_AUTH=true
GRPC_TLS_MIN_VERSIONMinimal TLS version (1.2 or 1.3)No (default: 1.2)

HTTP and gateway TLS environment variables ​

The HTTP API and the ConnectRPC/gRPC-web gateway take the same five settings under their own prefixes — HTTP_TLS_ and GATEWAY_TLS_:

SuffixPurpose
CERT_FILEServer certificate file (PEM)
KEY_FILEServer private key file (PEM)
CLIENT_AUTHEnable mTLS (true/false)
CA_FILECA bundle for client certificate verification
MIN_VERSIONMinimal TLS version (1.2 or 1.3)

The older CONNECTRPC_TLS_* names were removed in v3.20.0; use GATEWAY_TLS_*.

Examples ​

gRPC TLS (server auth only) ​

No GRPC_TLS_CA_FILE — the CA bundle is only needed to verify client certificates, which server-auth-only does not do.

bash
GRPC_TLS_CERT_FILE=./third_party/tls/tls12/server.crt \
GRPC_TLS_KEY_FILE=./third_party/tls/tls12/server.key \
GRPC_TLS_MIN_VERSION=1.2 \
gripmock --stub=examples examples

gRPC mTLS ​

bash
GRPC_TLS_CERT_FILE=./third_party/tls/mtls/server.crt \
GRPC_TLS_KEY_FILE=./third_party/tls/mtls/server.key \
GRPC_TLS_CA_FILE=./third_party/tls/mtls/ca.crt \
GRPC_TLS_CLIENT_AUTH=true \
GRPC_TLS_MIN_VERSION=1.3 \
gripmock --stub=examples examples

gripmock check with TLS ​

gripmock check uses the same GRPC_TLS_* environment variables as the server.

For TLS-enabled gRPC, check must trust the server certificate chain.

Minimal env for TLS (server auth only) ​

bash
GRPC_TLS_CA_FILE=./third_party/tls/tls13/ca.crt \
GRPC_TLS_MIN_VERSION=1.3 \
gripmock check --timeout=60s --silent

Env for mTLS ​

bash
GRPC_TLS_CA_FILE=./third_party/tls/mtls/ca.crt \
GRPC_TLS_CERT_FILE=./third_party/tls/mtls/client.crt \
GRPC_TLS_KEY_FILE=./third_party/tls/mtls/client.key \
GRPC_TLS_MIN_VERSION=1.3 \
gripmock check --timeout=60s --silent

Notes:

  • GRPC_TLS_CA_FILE is required in practice for self-signed/local CA certs.
  • GRPC_TLS_CERT_FILE + GRPC_TLS_KEY_FILE are required only when server enforces mTLS.
  • GRPC_TLS_CLIENT_AUTH affects server behavior and is not required for check itself.

Client-side test env (grpctestify) ​

When running grpctestify, set these vars for TLS calls:

bash
GRPCTESTIFY_TLS_CA_FILE=./third_party/tls/tls13/ca.crt
GRPCTESTIFY_TLS_SERVER_NAME=localhost
GRPCTESTIFY_TLS_CERT_FILE=./third_party/tls/mtls/client.crt
GRPCTESTIFY_TLS_KEY_FILE=./third_party/tls/mtls/client.key

For plain TLS (no mTLS), GRPCTESTIFY_TLS_CERT_FILE and GRPCTESTIFY_TLS_KEY_FILE can be empty.

Reverse proxy TLS termination ​

If you prefer terminating TLS on a proxy, keep GripMock on an internal port and route traffic through Caddy/Nginx.

Self-signed certificate setup ​

bash
mkdir certs && openssl req \
  -x509 -newkey rsa:2048 \
  -keyout certs/key.pem -out certs/cert.pem \
  -days 365 -nodes \
  -subj "/CN=localhost"

Caddy ​

yaml
services:
  gripmock:
    # ... existing configuration ...

  caddy:
    image: caddy:latest
    ports:
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./certs:/certs
    depends_on:
      - gripmock
    # ... other configuration ...
text
localhost:443 {
  tls /certs/cert.pem /certs/key.pem
  reverse_proxy gripmock:4770 {
    transport http {
      tls_insecure_skip_verify
    }
  }
}

Nginx ​

nginx
server {
  listen 443 ssl http2;
  ssl_certificate /etc/nginx/certs/cert.pem;
  ssl_certificate_key /etc/nginx/certs/key.pem;

  location / {
    grpc_pass grpc://gripmock:4770;
    grpc_ssl_verify off;
  }
}

Verification ​

bash
grpcurl -proto helloworld.proto \
  -cacert certs/cert.pem \
  -d '{"name": "TLS Test"}' \
  localhost:443 \
  helloworld.Greeter/SayHello