TEI Manager supports mutual TLS (mTLS) for securing gRPC connections. This guide covers certificate generation and configuration.
mTLS provides:
- Server authentication - Clients verify the server's identity
- Client authentication - Server verifies client certificates
- Encryption - All traffic is encrypted
Using OpenSSL to create a self-signed CA and certificates:
# Create directory for certs
mkdir -p certs && cd certs
# Generate CA key and certificate
openssl genrsa -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -out ca.pem \
-subj "/CN=tei-manager-ca/O=TEI Manager"
# Generate server key and CSR
openssl genrsa -out server-key.pem 4096
openssl req -new -key server-key.pem -out server.csr \
-subj "/CN=tei-manager/O=TEI Manager"
# Sign server certificate with CA
openssl x509 -req -days 365 -in server.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out server.pem \
-extfile <(echo "subjectAltName=DNS:localhost,DNS:tei-manager,IP:127.0.0.1")
# Generate client key and CSR
openssl genrsa -out client-key.pem 4096
openssl req -new -key client-key.pem -out client.csr \
-subj "/CN=tei-client/O=TEI Manager"
# Sign client certificate with CA
openssl x509 -req -days 365 -in client.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out client.pem
# Clean up CSRs
rm -f *.csrAdd to tei-manager.toml:
[grpc.tls]
cert_path = "/path/to/certs/server.pem"
key_path = "/path/to/certs/server-key.pem"
ca_path = "/path/to/certs/ca.pem"
require_client_cert = trueOr via environment variables:
export TEI_MANAGER_GRPC_TLS_CERT=/path/to/certs/server.pem
export TEI_MANAGER_GRPC_TLS_KEY=/path/to/certs/server-key.pem
export TEI_MANAGER_GRPC_TLS_CA=/path/to/certs/ca.pem
export TEI_MANAGER_GRPC_TLS_REQUIRE_CLIENT_CERT=trueUsing the bench-client:
bench-client -e https://localhost:9001 -i my-instance \
--cert certs/client.pem \
--key certs/client-key.pem \
--ca certs/ca.pem \
--mode arrow --num-texts 1000Using grpcurl:
grpcurl -cacert certs/ca.pem \
-cert certs/client.pem \
-key certs/client-key.pem \
-d '{"target": {"instance_name": "my-instance"}, "request": {"inputs": "test"}}' \
localhost:9001 tei_multiplexer.v1.TeiMultiplexer/Embed- Must have Subject Alternative Names (SANs) matching how clients connect:
DNS:localhost DNS:tei-manager DNS:tei-manager.namespace.svc.cluster.local IP:127.0.0.1 - Signed by a CA that clients trust
- Signed by a CA that the server trusts (same CA or cross-signed)
- Subject CN/O can be used for authorization (see below)
- Used by server to verify client certificates
- Used by clients to verify server certificate
- Can be the same CA or different CAs for client/server
TEI Manager can restrict access based on client certificate subject:
[grpc.tls]
cert_path = "server.pem"
key_path = "server-key.pem"
ca_path = "ca.pem"
require_client_cert = true
# Only allow clients with these subjects
allowed_subjects = [
"CN=authorized-client,O=My Org",
"CN=another-client,O=My Org"
]If allowed_subjects is empty or not set, any valid client certificate is accepted.
Alternatively, authorize based on Subject Alternative Names:
[grpc.tls]
# ...
allowed_sans = [
"DNS:client1.example.com",
"DNS:client2.example.com"
]- Generate new certificates before expiry
- Update server config to use new certs
- Restart TEI Manager (graceful)
- Distribute new client certs
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: tei-manager-server
spec:
secretName: tei-manager-tls
issuerRef:
name: ca-issuer
kind: ClusterIssuer
dnsNames:
- tei-manager
- tei-manager.default.svc.cluster.local
usages:
- server auth
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: tei-manager-client
spec:
secretName: tei-client-tls
issuerRef:
name: ca-issuer
kind: ClusterIssuer
commonName: tei-client
usages:
- client authMount in deployment:
volumeMounts:
- name: tls
mountPath: /certs
readOnly: true
volumes:
- name: tls
secret:
secretName: tei-manager-tls- Use 4096-bit RSA or P-384 EC keys
- Set certificate expiry ≤ 1 year
- Store private keys securely (K8s secrets, Vault)
- Enable
require_client_cert = truein production - Use specific
allowed_subjectsorallowed_sansif multi-tenant - Monitor certificate expiry dates
- Client doesn't trust server CA: Add
--ca ca.pemto client - Server doesn't trust client CA: Check
ca_pathin server config - Certificate expired: Check
openssl x509 -in cert.pem -noout -dates
- Server requires client cert but client didn't send one
- Add
--certand--keyto client command
- Server certificate SANs don't include the hostname client is connecting to
- Regenerate server cert with correct SANs
For development, disable mTLS by removing the [grpc.tls] section from config. The server will accept plaintext gRPC connections.