Skip to main content

Secure Database with SSL – A Step-by-Step Example

1. Generate SSL Certificates

Option A: Use Self‑Signed Certificates

# 1. Create Certificate Directory
mkdir -p mariadb_certs && cd mariadb_certs

# 2. Generate Certificate Authority (CA)
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem -subj "/CN=MySQL_CA"

# 3. Generate Server Certificate
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem -subj "/CN=localhost"
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

# 4. Set Permissions
sudo chmod 644 *.pem

#Import the server certificate into a Java truststore:
keytool -importcert -file server-cert.pem -alias mariadbserver -keystore truststore.jks

Copy truststore.jks to your REST API’s config-files directory.


Option B: Use CA‑Signed Certificates

For production environments, it is recommended to use certificates issued by a trusted Certificate Authority (CA). Follow your organization's standard process for requesting and deploying these certificates.


2. Mount Certificate Files into the Container

Create MariaDB SSL Configuration

Create a custom configuration file named custom.cnf:

[mysqld]
ssl=ON
ssl-ca=/etc/mysql/certs/ca-cert.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-key=/etc/mysql/certs/server-key.pem

Update docker-compose.yml

Mount the certificate directory and configuration file into the container:

services:
securosys_sql:
volumes:
- ./mariadb_certs:/etc/mysql/certs:ro
- ./custom.cnf:/etc/mysql/conf.d/custom.cnf:ro

3. Verify SSL is Enabled

Start the container and inspect the MariaDB logs to confirm SSL is active.

Connect and Test SSL

docker exec -it securosys_sql /bin/bash
mysql -h localhost -u <db-username> -p --ssl-ca=/etc/mysql/certs/ca-cert.pem

Replace <db-username> with your actual database user.


4. Configure REST API to Use SSL

Edit the application-local.yml file and update the JDBC URL to include SSL settings:

spring:
datasource:
url: jdbc:mariadb://securosys_sql:3306/securosys?sslMode=verify-ca&trustStore=/etc/app/config/truststore.jks&trustStorePassword=change-it
...

Restart your REST API container and verify it starts without errors.