有几个应用的数据运行在MariaDB套件中,并且开启了远程TCP连接,然后通过防火墙控制仅允许远程服务器连接。但是远程连接不使用TLS则存在传输安全问题,因此需要折腾配置一下MariaDB套件的TLS远程连接。
MariaDB套件的图形界面并未提供配置入口:
需要临时开启群晖服务器的SSH,登录后台进行配置。
1. 确认MariaDB 10套件是否支持SSL
使用mysql
命令以root用户连接MariaDB:
mysql -u root -p
验证下当前MariaDB 10套件是否支持已编译支持SSL:
SHOW VARIABLES LIKE 'have_ssl';
上图结果说明MariaDB 10套件已编译支持SSL,只是没有配置开启。
2. 查询MariaDB 10套件的错误日志路径
SHOW VARIABLES LIKE 'log_error';
3. 创建自签名证书
3.1. 生成CA私钥和证书
创建目录/etc/mariadb
目录,并进入该目录创建自签名证书。
- 创建私钥:
openssl genrsa -out mariadb-ca-key.pem 3072
- 基于上述私钥,创建X509证书:
openssl req -new -x509 -nodes -days 36500 -key mariadb-ca-key.pem -out mariadb-ca-cert.pem
3.2. 2.1.
3.2. 生成服务器私钥和证书
使用如下命令生成服务器私钥和CSR:
openssl req -newkey rsa:3072 -days 36500 -nodes -keyout mariadb-server-key.pem -out mariadb-server-req.pem
注意:生成服务器证书时的主体信息不要和CA证书的一样,否则会验签失败。
使用openssl rsa
命令移除私钥的密码:
openssl rsa -in mariadb-server-key.pem -out mariadb-server-key.pem
使用openssl x509
命令使用CA证书根据CSR生成自签名的X509证书:
openssl x509 -req -in mariadb-server-req.pem -CA mariadb-ca-cert.pem -CAkey mariadb-ca-key.pem -CAcreateserial -out mariadb-server-cert.pem -days 36500 -sha256
3.3. 校验证书
使用如下命令校验一下证书:
openssl verify -CAfile mariadb-ca-cert.pem mariadb-server-cert.pem
注意:如果创建CA证书和签发服务器证书时使用的签发者和证书主体相同,验证的时候会认为是自签名证书而校验出错。
4. 修改MariaDB配置文件
在服务器后台找到MariaDB的配置目录,路径在/var/packages/MariaDB10/etc
,该目录下当前配置文件如下:
创建一个新文件my.cnf
,配置如下内容:
[mysqld]
ssl-ca=/etc/mariadb/mariadb-ca-cert.pem
ssl-cert=/etc/mariadb/mariadb-server-cert.pem
ssl-key=/etc/mariadb/mariadb-server-key.pem
# 考虑是否全部强制走TLS
require_secure_transport=ON
配置完成后在套件中心重启MariaDB服务,或者使用如下命令启动MariaDB 10。
- 查看MariaDB 10状态
/usr/syno/bin/synopkg is_onoff MariaDB10
- 停止MariaDB 10
/usr/syno/bin/synopkg stop MariaDB10
- 启动MariaDB 10
/usr/syno/bin/synopkg start MariaDB10
5. MariaDB启动失败处理
在MariaDB 10的失败日志中发现:
2025-08-10 18:18:02 0 [ERROR] SSL error: SSL_CTX_set_default_verify_paths failed
2025-08-10 18:18:02 0 [ERROR] Aborting
使用如下命令检查证书路径权限:
sudo -u mysql cat /etc/mariadb/mariadb-server-cert.pem
修改/etc/mariadb
目录及证书的属主:
chown -R mysql:mysql /etc/mariadb
再次重启就ok啦。
6. 校验SSL是否启用
root@DSM-1621:/var/packages/MariaDB10/etc# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 16
MariaDB [(none)]>
MariaDB [(none)]>
MariaDB [(none)]> SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl | YES |
+---------------+-------+
1 row in set (0.001 sec)
MariaDB [(none)]>
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
+---------------------+--------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/mariadb/mariadb-ca-cert.pem |
| ssl_capath | |
| ssl_cert | /etc/mariadb/mariadb-server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /etc/mariadb/mariadb-server-key.pem |
| version_ssl_library | OpenSSL 1.1.1u 30 May 2023 |
+---------------------+--------------------------------------+
10 rows in set (0.001 sec)
7. 配置Wordpress使用TLS连接数据库
7.1. wp-config.php配置
在wp-config.php
文件中添加如下配置:
/** Force to use TLS **/
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
/** Specify CA certificate **/
define('MYSQL_SSL_CA', '{证书路径}/mariadb-ca-cert.pem');
注意证书的权限需要让Wordpress能够读取,与其它主题文件一样的属主。
7.2. MariaDB 10强制确定的客户端TLS连接
远程MariaDB用户需配置强制SSL连接,否则可能回退到非加密连接。
先确认一下当前用户的SSL状态:
MariaDB [(none)]>
MariaDB [(none)]> select user, host, ssl_type from mysql.user;
+-----------------+------------+----------+
| User | Host | ssl_type |
+-----------------+------------+----------+
| mariadb.sys | localhost | |
| root | localhost | |
| mysql | localhost | |
| PUBLIC | | |
| wordpress_user |{WP服务器IP} | |
+-----------------+-----------+----------+
7 rows in set (0.001 sec)
MariaDB [(none)]>
执行:
ALTER USER '{数据库用户名}'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
或者创建一个新用户:
CREATE USER '{数据库用户名}'@'{Wordpress服务器IP}' IDENTIFIED BY '{密码}' REQUIRE SSL;
GRANT ALL PRIVILEGES ON {数据库名}.* TO '{数据库用户名}'@'{Wordpress服务器IP}';
再执行如下命令刷新权限生效:
FLUSH PRIVILEGES;
再次查询SSL状态:
MariaDB [(none)]> select user, host, ssl_type from mysql.user;
+-----------------+---------------+----------+
| User | Host | ssl_type |
+-----------------+---------------+----------+
| mariadb.sys | localhost | |
| root | localhost | |
| mysql | localhost | |
| PUBLIC | | |
| wordpress_user | {WP服务器IP} | ANY |
+-----------------+---------------+----------+
7 rows in set (0.003 sec)
MariaDB [(none)]>
ssl_type
列的值说明:
- ANY:必须通过 SSL/TLS 加密连接登录,但不对客户端证书类型(如 X.509)做具体要求;
- SSL:强制加密但不验证客户端证书(仅验证服务器身份);
- X509: 强制加密且要求客户端提供有效证书(双向验证);
- 空值:允许非加密连接。
7.3. 重启MariaDB 10和Wordpress
分别重启MariaDB 10和Wordpress的Web服务器。
7.4. 检查连接状态
注释掉之前wp-config.php
的配置:
/** Force to use TLS **/
// define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
/** Specify CA certificate **/
// define('MYSQL_SSL_CA', '{证书路径}/mariadb-ca-cert.pem');
重启Web Server,此时Wordpress已经连接不上数据库了: