To enable mutual TLS (mTLS) in wstunnel, you must set up a Certificate Authority (CA) to sign both server and client certificates.
WARNING: The following steps are intended for development/testing environments only. For production, use a dedicated PKI solution like OpenBao, EJBCA, or Dogtag PKI.
1. Setup CA Directory Structure
Create a directory to hold the CA files:
$ mkdir -p $HOME/wstunnel/ca/{certs,csr,crl,newcerts,private}
$ cd $HOME/wstunnel/ca/
$ echo 1000 > serial
$ touch index.txt
2. Create OpenSSL Configuration
Create an openssl.cnf file in your CA directory. This configuration defines the directory locations, the root key/certificate, CRL settings, and specific extensions for server_cert and client_cert.
3. Generate CA Root
Generate an unencrypted private key and a self-signed root certificate:
$ openssl genrsa -out private/ca.key.pem 4096
$ openssl req -config openssl.cnf \
-key private/ca.key.pem \
-new -x509 -days 7300 -sha256 -extensions v3_ca \
-out certs/ca.cert.pem
4. Generate Server Certificate
Generate a key, a Certificate Signing Request (CSR), and sign it with your CA:
$ openssl genrsa -out private/wstunnel-server.pem 2048
$ openssl req -config openssl.cnf \
-key private/wstunnel-server.pem \
-new -sha256 -out csr/wstunnel-server.csr.pem
$ openssl ca -config openssl.cnf \
-extensions server_cert -days 375 -notext -md sha256 \
-in csr/wstunnel-server.csr.pem \
-out certs/wstunnel-server.cert.pem
5. Generate Client Certificate
Repeat the process for the client. Note that the Common Name (CN) must contain only valid URL characters:
$ openssl genrsa -out private/wstunnel-client-1.pem 2048
$ openssl req -config openssl.cnf \
-key private/wstunnel-client-1.pem \
-new -sha256 -out csr/wstunnel-client-1.csr.pem
$ openssl ca -config openssl.cnf \
-extensions client_cert -days 375 -notext -md sha256 \
-in csr/wstunnel-client-1.csr.pem \
-out certs/wstunnel-client-1.cert.pem