KB Article #191644
EMT topology TLS errors
Topology SSL Error After EMT Upgrade
Problem
After upgrading API Gateway / API Manager in EMT mode, the following SSL-related errors appear in the logs:
ERROR 31/Jul/2025:11:32:45.393 [01b3:000000000000000000000000] [SSL alert read 0x22e, 0x2e]: certificate unknown [fatal] { subject: /DC=host-1/OU=emt_anm_group/CN=nodemanager-1, thumbprint: 8A:79:ED:72:61:A5:C6:B5:70:D2:0A:66:F7:D6:74:2B:BC:D6:07:AF }.
ERROR 31/Jul/2025:11:32:45.393 [01b3:000000000000000000000000] [SSL_accept, 0x2e]: error - error.
ERROR 31/Jul/2025:11:32:45.393 [01b3:000000000000000000000000] error handling connection: SSL protocol error
error:0A000416:SSL routines::sslv3 alert certificate unknown, source location: ssl/record/rec_layer_s3.c:1605 ssl3_read_bytes, additional info: SSL alert number 46
These errors typically indicate that the node manager's certificate is not trusted or mismatched during inter-node communication.
Resolution
This issue is commonly caused when a custom FED is used for the Admin Node Manager (ANM), and its certificate differs from the domain certificate bundled with the container image.
The recommended resolution is to use your own domain Certificate Authority (CA). EMT-mode API Gateway supports injecting custom domain certificates for containerized deployments.
Prerequisites
1. PVC and Mount Setup
- The following Persistent Volume Claims (PVCs) should be present:
- PVC for the Admin node manager deployment (apigateway-anm)
- PVC for the traffic and apimgr deployments (apigateway-apitraffic, apigateway-apimgr)
- Mount each PVC under the
/mergedirectory. - Within each mounted directory, create the following structure:
apigateway/
└── groups/
└── certs/
├── domaincert.pem
└── private/
└── domainkey.pem
Documentation: Mount a Component Configuration | Update Domain Certificates at Runtime
2. Domain CA Generation
Use the following script to generate a self-signed domain CA certificate and encrypted private key:
#!/bin/bash # Output files KEY_FILE="domainkey.pem" CERT_FILE="domaincert.pem" # Generate encrypted private key openssl genrsa -aes256 -out "$KEY_FILE" 2048 # Create a temporary config file with extensions cat > ca_openssl.cnf <<EOF [ req ] distinguished_name = req_distinguished_name x509_extensions = v3_ca prompt = no [ req_distinguished_name ] CN = DefaultDomain [ v3_ca ] basicConstraints = critical, CA:TRUE, pathlen:0 keyUsage = critical, Digital Signature, Key Encipherment, Data Encipherment, Key Agreement, Certificate Sign EOF # Generate the self-signed certificate with the config openssl req -new -x509 -days 3650 -key "$KEY_FILE" \ -out "$CERT_FILE" -config ca_openssl.cnf # Cleanup rm ca_openssl.cnf echo "Done. Files generated:" echo " Private Key: $KEY_FILE" echo " Certificate: $CERT_FILE"
Note: You will be prompted for the passphrase three times — use the same password each time.
3. Helm Configuration
In your values.yaml for anm, apimgr, and apitraffic, set the following environment variable:
extraEnvVars:
- name: DOMAIN_KEY_PASSPHRASE
value: "SECRET123"
Replace SECRET123 with the passphrase you used when generating domainkey.pem.